学习指针,被弄的好晕…
1、如果定义一个数组int a[n],并拿数组名作为一个函数的参数进行传递的话,形参的形式可以写成int *a那么定义一个二维数组int a[n][m],还是拿数组名作为一个函数的参数进行传递,为什么形参的形式不能写成int **a呢?
2、定义一个指向数组的指针int (*p)[4];
1、如果定义一个数组int a[n],并拿数组名作为一个函数的参数进行传递的话,形参的形式可以写成int *a那么定义一个二维数组int a[n][m],还是拿数组名作为一个函数的参数进行传递,为什么形参的形式不能写成int **a呢?
2、定义一个指向数组的指针int (*p)[4];
如果想要初始化这个指针的话,应该是要把另一个包含四个元素的数组的地址赋给p
比如我写成下面这个样子
int a[4];
int (*p)[4];
下面是疑问:
a本来就是指向数组头元素的指针了,为什么初始化语句的形式不能写成p=a,而必须写成&a呢?
a是指向数组头元素的指针,那&a代表的是什么含义呢?指向数组头元素地址的指针?感觉这好像没什么实际含义似的啊……
3、如果我定义一个函数的形参形式是int **a,那么作为一个实参应该以一种什么类型来进行传递呢?除了同样定义一个双重指针进行传递以外
解决方案:100分
1. C 语言中所谓的“二维数组”,实际上是数组的数组。(“二维数组”这个叫法在这里非常误导人,“二维指针”也是一样)。C 语言中所谓的“二维指针”,实际上是指向指针的指针。
int a[10]; 是“含有10个(int)元素的数组”,它可以被转化为“指向(int)的指针”
int a[10]; 是“含有10个(int)元素的数组”,它可以被转化为“指向(int)的指针”
int a[10][20]; 是“含有10个(含有20个int元素的数组)元素的数组” (数组的数组),它可以被转化为“指向(含有20个int元素的数组)的指针” (数组的指针)。它不能被转化为int** (“指向(指向int的指针)的指针”)。
2. a 是数组,不是“指向数组头元素的指针”。a 出现在表达式中时,多数情况下会被自动转化为“指向数组头元素的指针”。
比如,在 p = a 中,a 会被转化为“指向数组头元素的指针”。然而此时 p 是“指向(含有4个int元素的数组)的指针”,两者类型不匹配。
&a 是一个 a 不会被转化的情况,此时 a 还是数组,对数组取地址,得到指向数组的指针(“指向(含有4个int元素的数组)的指针”)。p=&a 两者类型才匹配。
(顺带说一下,还有一种不会转化的情况是 sizeof(a))。
3. 这里你可以传一个指针数组。int *p[4];