我知道一个数组衰减到指针,如果一个声明
char things[8];
Run Code Online (Sandbox Code Playgroud)
然后在things其他地方使用,things是一个指向数组中第一个元素的指针.
另外,根据我的理解,如果有人宣称
char moreThings[8][8];
Run Code Online (Sandbox Code Playgroud)
那么moreThings它不是指向char的类型指针,而是类型为"指向char的指针数组",因为衰减只发生一次.
什么时候moreThings传递给一个函数(比如说原型void doThings(char thingsGoHere[8][8])实际上是什么进行了堆栈?
如果moreThings不是指针类型,那么这仍然是一个传递引用?我想我一直认为它moreThings仍然代表了多维数组的基地址.如果doThings接受输入thingsGoHere并将其传递给另一个函数会怎么样?
规则几乎是除非指定数组输入,const然后数组将始终可修改?
我知道类型检查的东西只发生在编译时,但我仍然对技术上作为一个引用传递的东西感到困惑(即只有当传递类型指针的参数时,或者指针数组是否为传递 - 参考也是?)
很抱歉这个问题在这个地方有点儿,但由于我很难理解这一点,很难说出一个精确的询问.
为什么要*(multi + row)生成指针地址而不是值?我很困惑,但必须有一个很好的解释,但我不知道.
#include <stdio.h>
#define ROWS 5
#define COLS 10
int multi[ROWS][COLS];
int main(void)
{
int row, col;
for (row = 0; row < ROWS; row++)
{
for (col = 0; col < COLS; col++)
{
multi[row][col] = row*col;
}
}
for (row = 0; row < ROWS; row++)
{
for (col = 0; col < COLS; col++)
{
printf("\n%d ",multi[row][col]);
printf("%d ",*(*(multi + row) + col));
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 当我测试双指针行为时,我得到了一个我不太了解的结果.
==>代码1:
int main (int argc , char **argv)
{
if(*argv+1 ==NULL)
{
printf("NULL pointer \n");
exit(0) ;
}
else
{
printf("test double pointer[] : %s \n ",*argv+1);
}
return(0);
}
Run Code Online (Sandbox Code Playgroud)
====>结果1
root@root:/home/aa/test# ./geip 1255
test double pointer[] : /geip
root@root:/home/aa/test#
Run Code Online (Sandbox Code Playgroud)
===>代码2:
int main (int argc , char **argv)
{
if(*argv+9 ==NULL)
{
printf("NULL pointer \n");
exit(0) ;
}
else
{
printf("test double pointer[] : %s \n ",*argv+9);
}
return(0);
}
Run Code Online (Sandbox Code Playgroud)
==>结果2:
root@root:/home/aa/test# ./geip 1255
test double pointer[] : 55 …Run Code Online (Sandbox Code Playgroud)