如果表达式type name[count]
是用某些函数编写的,则您告诉C编译器在堆栈帧上分配sizeof(type)*count
字节并计算数组中第一个元素的地址。
如果表达式type name[count]
是在所有函数和结构定义之外编写的,则您告诉C编译器在数据段上分配sizeof(type)*count
字节并计算数组中第一个元素的地址。
name
实际上是一个常量对象,它存储数组中第一个元素的地址,而每个存储某个内存地址的对象都称为指针,因此这就是您将其name
视为指针而不是数组的原因。请注意,只能通过指针访问C中的数组。
如果count
是一个求值为零的常数表达式,则您告诉C编译器在堆栈帧或数据段上分配零字节,并返回数组中第一个元素的地址,但是这样做的问题是第一个元素零长度数组不存在,并且您无法计算不存在的对象的地址。
这是合理的。count+1
在count
-length数组中不存在,因此这是C编译器禁止将零长度数组定义为函数内部和外部的变量的原因,因为name
then 的内容是什么?name
确切存储什么地址?
如果p
是指针,则表达式p[n]
等于*(p + n)
右边表达式中的星号*是指针的取消引用操作,这意味着访问指针所指向的内存p + n
或访问其地址存储在中的内存p + n
,其中p + n
指针表达式是它的地址,p
并将该数字加到该地址n
上。指针类型的大小p
。
是否可以添加地址和数字?
是的,这是可能的,因为地址是通常以十六进制表示的无符号整数。