C语言数组指针和指针数组

首先确定优先级:()>[]>*,另外数组指针,类比整型指针,表示指向数组的指针;指针数组,类比整型数组,表示元素为指针的数组。

数组指针

int (*p)[n] 首先()优先级高,它是一个指针,指向一个整型数组。n为数组的长度,当p+1时需要跨越n个整型数据的长度,通常用来表示二维数组及二维数组的函数传参。

//数组指针
int array_pointer()
{
    int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    int i, j;
    int (*p)[4] = a;  //记住这种定义格式
    for (i=0; i<3; ++i)
    {
        for (j=0; j<4; ++j)
        {
            printf("%-2dx20", *(*(p+i)+j));  /*%-2d中, '-'表示左对齐, 如果不写'-'则默认表示右对齐;2表示这个元素输出时占两个空格的空间*/
        }
        printf("
");
    }
    return 0;

}
//数组指针传参
int test(int (*p)[4])
{
    int i, j;    
    for (i=0; i<3; ++i)
    {
        for (j=0; j<4; ++j)
        {
            printf("%-2dx20", *(*(p+i)+j));  /*%-2d中, '-'表示左对齐, 如果不写'-'则默认表示右对齐;2表示这个元素输出时占两个空格的空间*/
        }
        printf("
");
    }
    return 0;

}


int main ()
{
    int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    test(a);
    return 0;  
}

指针数组

 int *p[n] 首先[]优先级高,它是一个数组,前面为int*,表示数组的元素为整型指针,也可表示为int **p, 这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量,可以用来存放变量地址。

//指针数组
int pointer_array()
{
    const char *names[] = {
                   "Zara Ali",
                   "Hina Ali",
                   "Nuha Ali",
                   "Sara Ali",
   };
   int i = 0;
 
   printf("names addr=%p
",names);
   for ( i = 0; i < MAX; i++)
   {
      printf("Value of names[%d] = %s  addr = %p 
", i, names[i],(names+i));
   }
   return 0;
}
int a = 1;
int b = 2;
int *p[2];
p[0] = &a;
p[1] = &b;

printf("%p
", p[0]); //a的地址
printf("%p
", &a); //a的地址
printf("%p
", p[1]); //b的地址
printf("%p
", &b); //b的地址
printf("%d
", *p[0]); //p[0]表示a的地址,则*p[0]表示a的值
printf("%d
", *p[1]); //p[1]表示b的地址,则*p[1]表示b的值


//将二维数组赋给指针数组
int *pp[3]; //一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2],所以要分别赋值
int c[3][4];
for (int i = 0; i < 3; i++)
    pp[i] = c[i];
原文地址:https://www.cnblogs.com/z3286586/p/13227260.html