对指针,数组以及指针和数组的总结
一级指针
二级指针
指针和数组
指针数组
首先先谈谈指针
指针(指针变量):指针是一个变量,里面存放的是地址;
(在32位平台下,指针占4个字节;在64位平台下,指针占8个字节;)
指针类型:有字符指针,整形指针,浮点指针,数组指针等
1.指针类型的意义在于进行+1操作时所跳转的步长,整形指针+1,跳转4个字节,字符指针+1,跳转1个字节;
2.指针解引用所访问的权限(是整型还是字符型);
一级指针
代码
int main()
{
int a[5]={1,2,3,4,5};
int *p;//*代表p是一个指针,指向int类型
p=a;
printf("%p\n",p);
printf("%p\n",p+1);
printf("%d\n",*p);
printf("%d\n",*(p+1));
return 0;
}
int * 代表定以一个整形指针,变量名为p ,将数组a的首地址赋值给p ,输出 p ,p+1 发现指针加1,跳转的是 4个字节,指针解引用 访问的是数组的第一个元素,+1再解引用,访问的是数组的第二个元素
二级指针
二级指针存放的的一级指针的地址
int a=0;
int *p=&a;//一级指针存放整形a的地址
int **pp=&p;//二级指针,第一个*代表pp是指向int*类型的,第二个*代表pp是指针类型的
代码
int main()
{
int a = 10;
int *p=&a;
int **pp = &p;
int ***ppp= &pp;
*p = 10;
printf("a =%d,*p =%d,%d,%d\n",a, *p, **pp, ***ppp);
return 0;
}
面运行结果可知,二级指针,三级指针都可以访问变量a
ppp进行 解引用
*ppp=pp;
*pp=p;
*p=a ;
***ppp=**pp=*p=a;
二级指针的运用,通常用于指针数组的传参
void fun(char **p)
{
}
int main()
{
char *p[] = { "abc","bcd","cdf" };
fun(p);
return 0;
}
指针和数组
数组:相同类型元素的集合
虽然数组名代表首元素的地址,但是数组名不是指针,数组和指针没关系,虽然在有些些方面,数组和指针在用法上面是一样的;
数组和指针都是单独的类型;
int main()
{
int a[5]={1,2,3,4,5};
int *p;//*代表p是一个指针,指向int类型
int i=0
p=a;
for(i=0;i<sizeof(a)/sizeof(a[0]);i++)
{
printf("%d ",a[i]);
printf("%d ",*(a+1));
printf("%d ",p[i]);
printf("%d ",*(p+1));
}
printf("\n");
return 0;
}
上面的代码都可以输出数组元素,以上数组和指针用法相似;
说到数值和指针,要考虑数组传参问题
在函数调用时,以数组为参数:
所有的数组在传参的时,都要进行降维(退化,要降维成指向数组内部元素类型的指针;数组传参只有第一个维度可以省略,剩下的都不可以
void fun1(int *arr1,int sz)//arr1指向整形
{
}
void fun2(int (*arr2)[3],int sz)//arr2 数组指针,指向一个长度为3的一维数组
{
}
void fun3(char **p;int sz)//指向一个char*类型的指针
{
}
int main()
{
int arr1[5]={1,2,3,4,5};
int arr2[2][3]={1,2,3,4,5,6};
char *p[]={"hahaha","wo","li","hai","bu"};//存放的是字符串的首地址
fun1(arr1,sizeof(arr1)/sizeof(arr1[0]));
fun2(arr2,sizeof(arr2)/sizeof(arr2[0]));
fun3(p,sizeof(p)/sizeof(p[0]));
return 0;
}
数组名其实代表的是数组首元素的地址,但其实数组名是一个指针常量,不可以被修改
**上面有一个数组 p,由“*“修饰,这个数组是指针数组 **
指针数组
首先,指针数组是一个数组,里面存放的是地址;
int *arr[5];
arr是一个数组,里面存放的每个元素都是整形指针;
###数组名
在上文中多次提到,数组名就是首元素地址,这是一般情况
1.sizeof(arr)->arr代表整个数组
2.&arr->代表整个数组
int main()
{
int arr[10]={0};
printf("%p\n",arr);
printf("%p\n",arr+1);
printf("%p\n",&arr);
printf("%p\n",&arr+1);
return 0;
}
arr+1 跳转四个字节, &arr+1跳转40个字节,代表&arr代表整个数组