想来学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 **不同,自然不可用。
结论:数组做为形参时,退化为指针
三维数组,退化为指向二维数组的指针 二维数组,退化为指向一维数组的指针 一维数组,退化为指向类型(如int)的指针