二级指针和数组

二级指针回顾

    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);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容