指针应该算得上是c语言的精华,但也是难点。
非常多教程或者博客都有对其具体的解说与分析。
我这一节的内容,也是解说指针。但我会尽量使用图解的方式,使大家非常easy理解及掌握。
一、基本使用
先来看看以下的代码:
int i = 3; int *p; p = &i; printf("i 存放的内容的值: %d, i 自己所在的地址: %p ", i, &i); printf("p 存放的地址的值: %p; p 自己所在的地址: %p; p 存放的地址所指所存放内容的值: %d", p, &p, *p); return 0;变量i是int类型,所以存放的是int数据。
变量p是int *类型。所以存放的是指向int类型的地址。
这样说,似乎还是没有表达清楚,我使用以下的一张图进行说明:
1. int i = 3; 这句话运行完成之后,变量i中的内容是3,如果 变量i本身的内存地址为 "0x8000"。
2. int *p; 仅仅是为指针变量p申请了一块内存地址,如果它的内存地址为 "0x7000",此时变量p中存放的内容为nil。
3. p = &i; 表示将变量i的地址赋值给指针p所存放的内容,至此,就呈现出了上图的情形。
所以程序中的那两句打印结果就非常明显了。
i 存放的内容的值: 3, i 自己所在的地址: 0x8000
p 存放的地址的值: 0x8000; p 自己所在的地址: 0x7000; p 存放的地址所指所存放内容的值: 3
二、 交换两个整数的值
演示样例代码例如以下:
void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int main(int argc, const char * argv[]) { int a = 3, b = 5; swap(&a ,&b); printf("a: %d; b: %d", a ,b); return 0; }当程序运行完 int a = 3, b = 5, 之后。如果a,b他们自己在内存中的地址分别为0x8000, 0x9000。例如以下图:
然后调用swap(&a, &b); 注意。这里传递的是变量a, b 本身的地址。而函数swap的接受形參int *a, int *b均是指针变量。用来接受传递过来的变量a, b的地址,即传递过来的变量a, b 和 函数 swap中的形式參数a, b 全然是两回事。为了以示差别,我将形參中的a, b 表达为 swap_a, swap_b。
所以将变量a, b 的地址赋值给swap_a 和 swap_b 之后。内存中的地址分布大致例如以下(如果swap_a本身的地址为0x6000, swap_b本身的地址为0x7000)。
int temp = *a, 定义一个暂时变量temp,用来存储指针swap_a 所指向变量a所存储的值。所以暂时变量temp此时存储的值为3,例如以下图:
*a = *b, 表示将将指针swap_b所指向变量b的内容赋值给指针swap_a所指向变量a的内容,所以运行完成之后,内存图大致例如以下:
最后一句代码 *b = temp, 就是将temp所存储的内容赋值给指针swap_b所指向的变量b存储的内容,所以运行完这句话之后,内存图大致例如以下:
当程序运行到swap函数 右边 “}” 结束后,此时,表示函数swap已经结束。而变量temp是局部变量,所以此时它也会被立马销毁,所以终于的内存结构图大致而下:
通过上面两个样例的图解,相信大家对指针的概念有了初步的了解,以下的内容,我就直接解说其内容不做绘图处理了。假设自己感兴趣的话。也能够绘图尝试尝试。
三、 字符数组与字符串常量
1. 字符数组
char str[] = "good"; while (*str != '