指针和数组的关系
1.一维数组
Int a[5]={1.2.3.4.5};
1)( P=&a[0]和p=a等价)
在C语言中数组名就是该数组的首地址
2)printf("%d",a[1]);
printf("%d",*(a+1)); 当我们以前使用a[1]的时候,
事实上计算机内部自动将其转换为*(a+1)
3) int a=[5];
int i,*p=a;
for(i=0;i<5;i++,p++){
scanf("%d",p);
}
for(i=0;i<5;i++,p++){
Printf("%d",*p);
注释里的内容不能够删除否则指针变量p就会指超出到a数组
4)上面程序p++不能换成a++
(因为p是指针变量。本身的值是可以变化的,
a虽然也是地址。But他是一个常量不能对一个常量自减或者自加)
2.二维数组
在二维数组中第一个下标代表行地址
第二个下标代表列地址
Eg: int a[2][3]={1,2,3,4,5,6};
a[0]代表第一行的首地址
a[1]代表第二行的首地址
printf("%d",*(a[0]+2));
元素 |
行地址 |
列地址 |
a[1][2] |
a[1] |
a[1]+2 |
*(a[1]+2) |
*(a+1) |
*(*(a+1)+2) |
*(*(a+1)+2) |
|
|
3.字符串指针
C语言中,有2种方式可以访问字符串1)通过字符数组访问2)指针访问
4.指针数组\
1)什么是指针数组:一个数组中所有的数据类型都是指针类型那么这就是指针数组
2)指针数组最大的好处是用来处理多字符串
因为我们的字符串本身就是用字符数组来储存的,如果涉及到多条字符串,就必须
用到二维字符数组。
定义一个指针数组
Char *p[]//这里我们定义一个指针数组;
Eg:char *p[3]={
"movie"
"movie1"
"movie2"}
m |
o |
v |
i |
e |
\0 |
|
m |
o |
v |
i |
e |
1 |
\0 |
5.void指针类型和NULL类型
定义指针以后必须进行初始化,不然很危险,因为它不知道该指向哪
如果不知道指到哪那就让它为空(NULL)
Eg: int *i;
I=NULL;
void指针类型
可以指向任何类型的c数据,也就是说可以用任何类型的指针变量给void类型赋值,但是当void类型指针要转成其他类型的时候,必须使用强制转换
Eg: int i=10;
int *p,*m;
void *q;
p=&i;
q=p;
m=(int*)q;
printf("%d",*m);
6.多级指针(又叫指针的指针)
int i=10;
int *p=&i;
int **q=&p;
int ***r=&q;
printf("%d\n",***r);//输出i的值
printf("%d\n",**r);//输出p的值
printf("%d\n",*r);//输出q的值