01.目录
02.一个误区
想来学C语言的人,都会觉得数组并不是很难,一问C语言最难的是什么?指针?结构体?
今天我就以我们认为不难的数组聊聊。
上学的时候老师就告诉我们:一个[]就想当与一个*。这句话有问题嘛?答案是没问题。
但是,就是因为这个没问题,导致工作中有问题。
一个简单的思考:
int arr[4][5];
int** p = arr;
请问,有问题嘛?
好想没问题,老师不是说了嘛,一个[]代表一个*,两个不就是两个*嘛。
我想说的是问题就出在这里,这么写,不会报语义错误,但是编译器会报错。
比如:
#include <stdlib.h>
#include <stdio.h>
void test(int** p,int len){}; //代码块我不写代码
int main()
{
int arr[3][3] = {0};
int len = sizeof(arr) / sizeof(*arr);
test(arr,len);
system("pause");
return 0;
}
这里将二维数组作为参数传入函数的时候,编译器会做一步操作!
int** p = (*arr)[4]; //error,这里会报间接级别不同
如果上面这个还看不出来错在哪儿,C语言确实是我们没学好。
数组实际类型是int [3][4],在作为右值时可以被转化为int (*)[4],它们都和int **不同,自然不可用。
03.二维数组作为函数参数
结论:数组做为形参时,退化为指针
三维数组,退化为指向二维数组的指针
二维数组,退化为指向一维数组的指针
一维数组,退化为指向类型(如int)的指针