指针 与数组 并没有什么关系,
指针就是指针,指针变量在32位系统下,永远占4个byte,其值为某一个内存的地址,指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到;
数组就是数组,其大小与元素的类型和个数有关,定义数组时必须指定其元素的类型和个数,数组可以存储任何类型的数据,但是不能存放函数;;
char *p = "abcdef"; // "abcdef" 放在静态区;
1) 以指针的形式:*(p+4) 这种形式先取出p存储的地址值,然后在加上4个字符的偏移量,得到新的地址,然后取出这个新的地址上的值:
2) 以下标的形式: p[4] . 编译器总是把以下标的形式的操作解析为以指针的形式的操作。p[4]这个操作会被解析成:先取出p存储的地址值,然后在加上4个字符的偏移量,得到新的地址,然后取出这个新的地址上的值:
两种方式在本质并没有什么区别,只是写法上的不同;
a 与 &a 的区别;;
int a[5] = { 1, 2, 3 ,4 ,5};
int *ptr = (int *)(&a+1); // 1 是 + sizeof(a) ?20byte?
printf("%d %d
" ,*(a+1) , *( ptr-1)); // 1 是sizeof(a[0]) ; //
对指针进行加1操作,得到的是下一个元素的地址,而不是原有地址值直接加1,所以一个类型为T的指针的移动,以sizeiof(T)为移动单位
&a+1: 去数组a的首地址,该地址的值加上sizeof(a)的值,即 &a+5*sizeof(int),也就是下一个数组的首地址,显然当前指针已经越过了数组的界限;;
(int *)(&a+1): 将越出数组的地址,强制转化为 int* 类型,赋值给ptr;
*(a+1): a 与 &a 的值是一样的,但意思不一样,a是数组首元素的首地址,也就是a[0]的首地址, &a是数组的首地址。
a+1是数组下一元素的首地址,即a[1]的首地址, 所以输出2;;//
&a+1是下一个数组的首地址, //