加入CSDN是出于记录,希望有不足之处多加指正。
1、指针代码分析 &a
#include <stdio.h>
int main(int argc, char const *argv[])
{
int (*p)[5] = NULL;
int arr[5] = {1,2,3,4,6};
p = &arr; //p 指向的是整个数组的首地址
printf("arr = %p\n", arr);
printf("&arr = %p\n", &arr);
printf("p = %p\n", p);
printf("*p = %p\n", *p);
printf("p+1 = %p\n", p+1);
printf("p+1 = %p\n", p+1);
printf("(*p)+1 = %p\n", (*p)+1);
}
运行结果:
gec@ubuntu:~/cyy$ ./zhizheng
arr = 0x7ffd568442d0 //数组首元素的首地址
&arr = 0x7ffd568442d0 //整个数组的首地址
p = 0x7ffd568442d0 //整个数组的首地址
*p = 0x7ffd568442d0 //通过指针来访问了该数组首元素
p+1 = 0x7ffd568442e4 //p 的类型为int [5] 所以加 1相当于加5个整型20字节
p+1 = 0x7ffd568442e4 //p 的类型为int [5] 所以加 1相当于加5个整型20字节
(*p)+1 = 0x7ffd568442d4 //*p 相当于arr + 1,arr是数组首元素的首地址,+1就加一个整型大小4字节
2、指针代码分析 &a+1 和 a+1
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[5] = {1,2,3,4,5};
int b[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
printf("&a = %p\n",&a);
printf("&a+1 = %p\n",&a+1); //&a 表示整个数组 +1,加一个数组大小
printf("a = %p\n",a);
printf("a+1 = %p\n",a+1); //a 表示数组首元素的首地址 +1,表示增加一个单位
return 0;
}
运行结果:
gec@ubuntu:~/cyy$ ./zhi2
&a = 0x7ffc7b441010
&a+1 = 0x7ffc7b441024
a = 0x7ffc7b441010
a+1 = 0x7ffc7b441014
3、首地址的指向重要性
#include <stdio.h>
int main(int argc , char const *argv[])
{
int arr[] = {1,2,3,4,5};
int *p = &arr[2];
printf("%d ,%d ,%d ,%d ,%d\n",*(p - 2),*(p - 1),*p,*(p + 1),*(p + 2));
return 0;
}
运行结果:
gec@ubuntu:~/cyy$ ./zhi3
1 ,2 ,3 ,4 ,5
4、指针 ++ 运算顺序
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[3] = {1,2,3};
int *p;
p = a;
printf("%d", *(++p));
return 0;
}
运行结果:2