C语言:数组指针&指针数组

顺序不同,表示的含义也不同,数组指针是指针,指针数组是数组,记后面两个字就好啦
怎么认识数组指针or指针数组?
看优先级:谁优先级高,和谁先结合,就是谁
举例:

 int *p[10];//指针数组
 //[]优先级比*高,所以为数组,数组的地址放在指向数组的指针里,所以叫指针数组
 int (*p)[10];//数组指针
 //()优先级高,所以和里面的*结合,所以是一个指针变量,指向一个整形数组,所以叫数组指针

数组指针

比如:整形指针 int *a 是能够指向整形数据的指针;float *a是指向浮点型数据的指针,所以,数组指针是指向数组的指针,所以,在访问数组时,可以用数组下标访问,也可以用指针访问

&数组名 VS 数组名
大小一样,但含义不同,如果两者都同时加一个数,则大小也不同,
数组名代表该数组的首元素地址
&数组名代表整个数组

int main()
{
 int a[10] = { 0 };
 printf("%p\n", a);//大小为首元素大小4,代表数组首元素地址
 printf("%p\n", &a);//大小为首元素大小4,代表整个数组的地址

 printf("%p\n", a + 1);//大小为8,加上了下一个元素的地址大小
 printf("%p\n", &a + 1);//&a+1相对于&a的差值40,即加了整个数组的大小
 return 0;
}

数组指针的使用

void print1(int a[][5], int row, int col)//用数组接收
{
 int i = 0;
 for (; i < row; i++)
 {
  int j = 0;
  for (; j < col; j++)
  {
   printf("%d ", a[i][j]);
  }
  printf("\n");
 }
}

void print2(int (*p)[5], int row, int col)//用数组指针来接收
{
 int i = 0;
 for (; i < row; i++)
 {
  int j = 0;
  for (; j < col; j++)
  {
   printf("%d ", a[i][j]);
  }
  printf("\n");
 }
}

int main()
{
 int a[3][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
 print1(a, 3, 5);//a为首元素大小,二维数组首元素是一维数组,所以大小为这个一维数组的大小,也可以说是第一行的大小
 print2(a, 3, 5);
 system("pause");
 return 0;
}

指针数组

数组里面放指针的数组是指针数组

int *a[10];//数组里放了10个整形指针,一个整形指针的大小为4,所以该数组的大小是40
printf("&d\n",sizeof(a+1));//数组下一个元素地址,所以大小为4
发布了73 篇原创文章 · 获赞 2 · 访问量 2875

猜你喜欢

转载自blog.csdn.net/weixin_43219708/article/details/103121537