1.指针变量和地址
1.1取地址操作符(&)
在C语言中创建变量就是向内存申请空间。用操作符(&)取出地址。如:
#inculde <stdio.h> int main() { int a = 10; &a; printf("%p", &a); return 0; } |
1.2指针变量与解引用操作符(*)
1.2.1指针变量
通过取地址操作符(&)拿到地址是一个数值,如:0x006FFD70,这个数值需要存储起来,以便使用。于是存储在指针变量中。
指针变量是一种变量,用来存放地址,存放在指针变量的值都会理解为地址。
如:
#inculde <stdio.h> int main() { int a = 10; int *pa = &a;//取出a地址并存放指针变量pa中 return 0; } |
1.2.2解引用操作符
C语言中拿到指针,就能通过指针找到指向对象。需要解引用操作符(*)。
#inculde <stdio.h> int main() { int a = 10; int *pa = &a;// *说明pa是指针变量,int说明pa指向是整型(int)类型对象 *pa = 0; return 0; } |
上面代码使用解引用操作符,*pa指通过pa中存放的地址,找到指向空间。*pa就是a变量,*pa = 0,就是把a改成0。
1.3指针变量大小
32位平台下地址是32个bit位,指针变量大小是4字节。
64位平台下地址是62个bit位,指针变量大小是5字节。
注意指针变量大小和类型无关,只要指针类型的变量,在相同的平台下,大小都是相同的。
2.指针变量类型的意义
2.1指针的解引用
指针变量的大小和类型无关,只要指针变量,在同一平台下,大小都是一样的。但指针类型有特殊意义。
//代码1 #inculde <stdio.h> int main() { int a = 0x11223344; int *pi = &a; *pi = 0; return 0; } //代码2 #inculde <stdio.h> int main() { int a = 0x11223344; char *pi =(char *)&a; *pi = 0; return 0; } |
调试中会看到代码1将n的4个字节全部改为0,代码2只将n的第一个字节改为0。
指针的类型决定了,对指针解引用时有多大权限。