指针是什么?
数据在内存中的地址也称为指针,而存放指针(地址)的变量为指针变量。
指针变量的值就是某份数据的地址
1 2 3 4 5 6 7 8 9
| int main() { int a = 10; int *p = &a;
return 0; }
|
定义指针变量
1 2 3 4 5 6 7
| datatype *name; 或 datatype *name = value;
* 代表这是一个指针变量 datatype 表示指针变量指向的数据的类型 value 是指针,也就是数据地址。
|
实例
1 2 3
| int a = 10; int *p = &a;
|
指针变量的大小是多少?
指针的大小在32位平台是4个字节,在64位平台是8个字节。
指针类型
1 2 3 4 5 6 7 8 9 10
| char *pc = NULL; int *pi = NULL; short *ps = NULL; long *pl = NULL; float *pf = NULL; double *pd = NULL;
|
1)秒判断出 指针的类型
只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。
1 2 3 4 5
| int*ptr; char*ptr; int**ptr; int(*ptr)[3]; int*(*ptr)[4];
|
2)秒判断出 指针所指向数据的类型
只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。
1 2 3 4 5
| int*ptr; char*ptr; int**ptr; int(*ptr)[3]; int*(*ptr)[4];
|
指针+-整数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| int main() { int n = 10; char a = 'a'; short n2 = '10'; char* pc = &a; int* pi = &n; short* ps = &n2;
printf("&a = %p\n", &a); printf("pc = %p\n", pc); printf("pc+1 = %p\n", pc + 1); printf("&n = %p\n", &n); printf("pi = %p\n", pi); printf("pi+1 = %p\n", pi + 1); printf("&n = %p\n", &n2); printf("pi = %p\n", ps); printf("pi+1 = %p\n", ps + 1); return 0; }
输出:
|
以上代码得出:
指针的类型决定了指针向前或者向后走一步有多大(距离)。
指针的解引用
指针变量存储了数据的地址,通过指针变量能够获得该地址上的数据(根据门牌号找房间里的东西)
实例1
1 2 3 4 5 6 7 8
| int main(){ int a = 10; int *p = &a; printf("%d, %d\n", a, *p); //两种方式都可以输出a的值 return 0; } 输出: //10, 10
|
实例2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| int main() { int n = 0x11223344; char* pc = (char*)&n; int* pi = &n;
printf("%p\n", pc); printf("%p\n", pi);
printf("%#x\n", *pc); printf("%#x\n", *pi);
*pc = 0; printf("%#x\n", n); n = 0x11223344; *pi = 0; printf("%#x\n", n); return 0; }
输出:
|
以上代码得出:
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。
比如: char 的指针解引用就只能访问一个字节,而 int 的指针的解引用就能访问四个字节。
未完待续…