数组名称是什么
数组是指可以连续使用的内存。
例如声明int数组
intarray [ ]={ 1,2,3 };
array代表什么? 根据某资料,数组名是指向数组开头地址的常数指针。
验证一下吧。
sizeof操作符知道一个对象或类型可以返回所占的内存字节数。
例如:
int i=1;
那么,sizeof(I )的结果是4 ) 64位计算机下的编译器的一部分是8 )
那么,打印sizeof (阵列)
printf(%d(n ),sizeof )阵列);
结果是12。
但是,大家都知道sizeof (指针变量)==4。
所有结果都是数组名称不是指向数组开头地址的常量指针。
为什么不完整呢,是利用数组访问数组元素的时候。 变得像常数的指针。
例如
array[0]相当于*(array0)
此时,array是指向数组开头地址的常量指针,指针类型是指向数组元素类型的指针。 这里就是int*型
我们可以这样理解:
一所大学的名字叫array。
有人问你array是什么。 你告诉他array是大学,面积多少等等。
但是,如果有人问我怎么去那个,我会告诉你那个的校门(最初的地址)在哪里。
结论数组名称实际上表示内存区域,但在使用时会成为指向数组起始地址的常数指针。
但这里还有另一个小陷阱:
#包含
voidfoo(inta[ )
{
printf(%d(n ),sizeof(a ) a );
}
入主(void ) )。
{
intarray [ ]={ 1,2,3 };
foo (阵列;
返回0;
}
输出是4而不是12。
从效率的观点来看,数组参数是参考参数而不是复制参数。 因为数组的长度可能很大,所以复制会占用太多资源。
虽然我是这样的函数
voidfoo(inta[ )
{
printf(%d(n ),sizeof(a ) a );
}
在编译器眼里是这样的
voidfoo(int*a ) )。
{
printf(%d(n ),sizeof(a ) a );
}
因此,sizeof(a )是sizeof (指针变量)一定是4
双字符数组
我们先来看一下简单的步骤
#包含
入主(void ) )。
{
char *str1='abc ';
char str2[]='def ';
printf(%s(n ),str1 4 );
返回0;
}
输出的结果是def。
我们只要用在c语言里xxxxx
',系统会自动将双引号的内容添加到字符常数区域。
注意: printf(xxxx ); 不会将' xxxx '添加到字符常量字段中。
char *str1='abc '; 将//ABC0添加到字符常数区域,将起始地址分配给str指针变量。
char str2[]='def '; //def 被添加到字符常量区域,字符数组的内容也被添加到函数堆栈,其中str2指向堆栈中的数组。
char str[]={'x ',' y ',' z'}; //只需向函数堆栈中添加数组
由于字符常量字段是连续的
printf(%s(n ),str1 4 );
可以打印str2的值。
三维排列
intarray [ ] [3]={ 1,2,3,4,5,6 };
如上所述,使用数组访问元素时,是指向数组元素的指针类型,是指向数组开头地址的指针。
二维数组的元素是数组。
这样写会更容易理解:
intarray [ ] [3]={ 1,2,3 },{ 4,5,6 };
所有这样认为的array都这样认为
int(*ConstArray ) [3];
访问数组元素时
从编译器的角度来看,array[x][y]是*(* ) (arrayx ) )。
*(array x )得到了第x行的类型为“int [3]”(c语言中没有这样的写法)的数组。
数组名称在访问元素时用作起始地址指针。 其中*(arrayx )与数组名称相同。
指针类型int *是指阵列大小(int * ) [3] ) x的地址。
使用*(*(arrayx ) y )访问此数组中的第y个元素。
这些是我对c语言序列的理解。 如果有错误的地方,谢谢您的指出。 请轻轻吹。