1,指针就是指针,指针变量在32位系统下,占4个字节,其值为某 个内存的地址。可以指向任何地 方。
2,数组就是数组,其大小与元素的类型和个数有关;定义数组时,必须指定元素的类型个元素的个数; 数组可以存放任何数据类型,但
不可以存放函数。
3,它们之间没有任何的关系,只是穿着相似的衣服来逗你玩罢了。
4,以指针的形式访问指针和以下标的形式访问指针
char* p = "abcdef";
a,定义一个指针变量p,p本身在栈上占4个字节,p里存储的是一块内存的首地址。这块内存在静 态区,大小为7个字节。
b,这块内存没有名字,对这块内存的访问完全是匿名访问。
c,可以通过*(p+4)指针的形式,取出p里存储的地址值,再加上4个字符的偏移量,最后取出该地址 值对应的值。
d,也可以通过p[4]下标的形式,但编译器最终会解析成c中的形式,本质上是相同的,只是写法不 同罢了。
5,以指针的形式访问数组和以下标的形式访问数组
char a[] = "123456";
a,定义了一个数组a,a拥有7个char类型的元素,其空间大小为7.数组a本身在栈上面。
b,对a的元素的访问必须先根据数组的名字a找到数组首元素的首地址,然后根据偏移量找到相应 的值。即:‘具名+匿名’访问
c,如果要访问5,以指针的形式:*(a+4),a这时候代表的是数组首元素的首地址,访问的方式同4 中的 c。
d,要是以下标的形式,a[4],道理同4中的d。
6,由4,5可以得出,指针和数组根本就是两个完全不一样的东西,它们都可以“以指针的形式”或“以下标 的形式”进行访问。
一个是完全匿名,一个是具名+匿名。
7,数组a[4],这里的a和&a两者有什么区别? 看下面的例子。
main()
{
int a[5] = {1,2,3,4,5};
int* p = (int*)(&a+1);
printf("%d,%d",*(a+1),*(p-1));
}
a,(&a+1),表示下一个数组的首地址,显然当前指针已经越过了数组的界限
b,(int*)(&a+1),把上一步得出来的地址进行强制转化,转化为(int*)型的,并将其赋给p
c,*(a+1):a和&a的值是一样的,但意思不一样,a是数组首元素的首地址,&a是数组的首地址, a+1是 下一个元素的首地址,
即a[1]的首地址,&a+1是下一个数组的首地址。
d,*(p-1)因为p是指向a[5],并具p是int*型的,所以*(p-1)是指向a[4],输出5.