C语言 数组指针与指针数组区别


数组指针(也称行指针)
int (*p)[n];
()优先及高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
int a[3][2]
int (*p)[2]
p = a;
p++; 该语句执行后,也就是p=p+1,p跨过a[0][]指向了a[1][]
所以数组指针也称指向一维数组的指针,亦称行指针。
查看下例demo:
#include<stdio.h>
int main(){
        int a[3][2] = {{1,2},{3,4},{5,6}};
        int (*p)[2] = a;
        int row = sizeof(a)/sizeof(a[0]);
        int col = sizeof(a[0])/sizeof(a[0][0]);
        printf("row = %d ,col = %d\n",row,col);
        int i = 0, j = 0;
        for(i = 0;i< row;i++){
                for(j = 0; j < col;j++){
                        printf("%d ",a[i][j]);
                }
                printf("\n");
        }

        int *p1 = p[0];
        printf("%d,%d",*p1,*p1+1);
        p1 = p[1];
        printf("%d,%d",*p1,*p1+1);
        return 0;
}



指针数组
定义int *p[n]
[]优先级高,先与p结合成为一个数组,再由int *说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,
这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。
#include<stdio.h>
int main(){
        int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
        int *p[3];
        int row = sizeof(a)/sizeof(a[0]);
        int col = sizeof(a[0])/sizeof(a[0][0]);
        int i = 0, j = 0;
        for(i = 0; i < row;i++){
                p[i] = a[i];
                for(j = 0;j < col;j++){
                        printf("%d ",*p[i]+j);
                }
                printf("\n");
        }
        return 0;
}


猜你喜欢

转载自blog.csdn.net/czj1992czj/article/details/79835020