二级指针回顾
int a = 10;
int *p = &a;
int **pp = &p;
// printf("%p %p %p\n",&a,p,*pp);
pp = pp+1;//pp的地址没变,pp存储的内容变化了,
//其实就是二级指针和一级指针的联系断开了。
// printf("%d %d\n",*p,**pp);
printf("%p %p %p %p\n",&a,p,&p,pp);
无标题.png
二级指针和二维数组
char a[][6]={{"hello"},{"world"},{"apple"}};
int row = sizeof(arr)/sizeof(arr[0]);
1、a+1 指向的是第一行的元素,也就是指向一个一维数组
2、a[1] 指向的是第一行,第0列的元素的地址
3、*(a+1) 指向的是第一行,第0列的元素的地址
4、a[1]+2 指向的是第一行的第二列的元素的地址
5、*(a+1)+2 指向的是第一行的第二列的元素的地址
6、*(a[1]+2) 指向的是第一行的第二列的元素7、*(*(a+1)+2) 指向的是第一行的第二列的元素
练习
使用指针,分别求二维数组的行的和
int get_sum(int (*p)[3],int n){
if(NULL == p){
return -1;
}
int i =0;
int j = 0;
int sum = 0;
for(i=0;i<n;i++){
for(j=0;j<3;j++){
sum+=p[i][j];// *(p[i]+j) *(*(p+i)+j)
}
printf("%d\n",sum);
sum = 0;
}
}
二维数组传参问题
两种传参形式:char (*p)[3]或者char arr[][3]
//char **pchar = arr;//??
int (*p)[3]=NULL;//一个指针p指向int[3]型的数据
int arr[][3]={1,2,3,4,5,6};
p=arr;
printf("%p %p\n",p,arr);
char ch = 'a';
char *q = &ch;
char **pchar=&q;//pchar+1的步长是多少? ----->4个字节
printf("%p %p\n",pchar,pchar+1);
结论
char *pchar 不等价arr
int (p)[3]和arr等价的 数组指针 int p[][3]
//p+1和arr+1的移动步长是一样的,都是移动了int[3]个长度,
//也就是移动了12个字节。
指针数组和数组指针
char q[3]; 指针数组
char qq[3]={"hello","world","apple"};
数组名字是q ,数组中存储了三个元素,每个元素都是指针。
printf("%s\n",qq[0]);
qq+1;//移动几个字节 4个字节。
练习
void print_arr(){
char array[4]={"abc"};
printf("%p %p %p\n",&array[0],&array[1],&array[2]);
char *p = &array[0];
char **pp = &p;
*pp = *pp+1;
printf("%c\n",*p);
}