(1)应注意其二维数组的书写形式,以及逗号表达式的
#include<stdio.h>
int main()
{
int a[3][2]= {(0,1),(2,3),(4,5)};
//因为这是()代表逗号表达式,而不是二维数组
//所以表示{1,3,5}
int *p;
p = a[0];
printf("%d",p[0]);
return 0;
}
(2)要注意数组名表示首元素地址,解引用之后表示首元素,&a表示整个数组,+1表示指向数组后面的地址,ptr-1又指向数组末尾,解引用表示最后一个元素
#include<stdio.h>
int main()
{
int a[5] = {1,2,3,4,5};
int * ptr = (int*)(&a+1);
printf("%d %d",*(a+1),*(ptr-1));
//a表示数组首元素的地址,ptr-1表示数组末尾元素的地址,解引用是5
return 0;
}
(3)注意:指针+1和类型有关,整数+1就是+1.
#include<stdio.h>
struct Num
{
itn Num;
char* pcName;
short sDate;
char cha[2];
short sBa[4];
}*p = (struct Test*)0x100000;
int main()
{
printf("%p\n",p+ 0x1);//p是结构体指针,+1就是跳过一个结构体,一个结构体是20个字节
//0x00100014 ,20转化为16进制是14。
printf("%p\n",(unsigned long)p + 0x1);//整数+1---0x00100001
printf("%p\n",(unsigned int*)p + 0x1);//+1跳过一个unsigned int类型的变量是4个字节 --0x00100004
return 0;
}
(4)硬是要把int(*)[5]赋给int(*)[4]类型,最好画出其图案方便理解在内存中的存储问题。
(5)画出他的内存空间,便于理解指针的指向问题,
&arr+1表示指针指向数组后的地址,然后又ptr-1解引用后表示数组的最后一个元素。
aa表示数组首元素地址,+1表示第二行首元素的地址6
#include<stdio.h>
int main()
{
int aa[2][5] = {1,2,3,4,5,6,7,8,9,10};
int *ptr1 = (int*)(&aa + 1);//&数组名表示整个数组,+1表示指向数组后面的地址
int *ptr2 = (int*)(*(aa+1));//数组名表示首元素地址,二维数组+1,数组名表示下一行的元素
printf("%d , %d",*(ptr1-1),*(ptr2-1));//ptr1-1表示 数组的末尾元素,ptr2指向6.
return 0;
}
(6)画出图形,标好指向更容易看出
#include<stdio.h>
int main()
{
char* a[]={"work","at","alibaba"};//数组有三个元素分别是三个字符串"work""at""ablibaba"
char** pa = a; //二级指针p,a表示数组首元素地址
pa++; //指向下一个存储空间
printf("%s\n",*pa); //最后输出的值是at
return 0;
}
(7)按照右图对其分析