- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我很难理解 C 中数组名称的类型和用法。这可能看起来很长,但请耐心等待。
我理解以下语句将 a
声明为 int []
类型,即 整数数组。
int a[30];
虽然 a
也指向数组的第一个元素,并且像 *(a+2)
这样的东西是有效的。因此,使 a
看起来像一个指向整数的指针。但实际上类型 int []
和 int*
是不同的;而前者是数组类型,后者是指向整数的指针。
int []
类型的变量在传递给函数时也会被转换为 int*
类型的变量;与在 C
中一样,数组通过引用传递(sizeof
运算符除外)。
让我悬垂的要点来了。看看下面的代码:
int main()
{
int (*p)[3];
int a[3] = { 5, 4, 6 };
p = &a;
printf("a:%d\t&a:%d\n",a,&a);
printf("%d",*(*p + 2));
}
输出:
a:2686720 &a:2686720
6
那么,上面的代码是如何工作的呢?我有两个问题:
a
和 &a
具有相同的值。为什么?int (*p)[3];
究竟做了什么?它声明了一个指向数组的指针,我知道这一点。但是,指向数组的指针与指向数组第一个元素的指针和数组名称有何不同?谁能澄清一下?我有很多困惑。
我知道我应该使用 %p
作为占位符而不是使用 %d
来打印指针变量的值。因为使用整数占位符可能会打印截断的地址。但我只是想让事情简单点。
最佳答案
其他答案已经解释了这个问题。我试图用一些图表来解释它。希望这会有所帮助。
当你声明一个数组时
int a[3] = {5, 4, 6}
内存排列是这样的
现在回答你的问题:
a
and&a
have the same values.How?
如您所知,a
是数组类型,并且数组名称 a
成为指向数组 a
第一个元素的指针(在衰减之后), 即它指向地址 0x100
。请注意,0x100
也是内存块(数组a
)的起始地址。你应该知道,一般来说,第一个字节的地址被称为变量的地址。也就是说,如果一个变量有 100 个字节,那么它的地址等于它的第一个字节的地址。
&a
是整个内存块的地址,即数组a
的地址。看图:
现在您可以理解为什么a
和&a
具有相同的地址值,尽管它们是不同的类型。
What exactly it does
int (*p)[3];
Declares a pointer to an array,i know this.But,how a pointer to an array is different from the pointer to the first element of the array and name of the array?
见上图,清楚地解释了指向数组的指针与指向数组元素的指针有何不同。
当您将 &a
分配给 p
时,p
将指向起始地址为 0x100
的整个数组。
注意:关于行
... as in
C
arrays are passed by references (with exception ofsizeof
function).
在 C 中,参数是按值传递的。 C 中没有通过引用传递。当一个普通变量被传递给一个函数时,它的值被复制;对相应参数的任何更改都不会影响变量。
数组也是按值传递的,但不同的是数组名称衰减为指向第一个元素的指针,并将 this 指针分配给函数的参数(此处,指针值被复制);数组本身不会被复制。
与普通变量不同,用作参数的数组不受任何更改的保护,因为没有对数组本身进行复制,而是复制指向第一个元素的指针。
您还应该注意 sizeof
不是函数,数组名称在这种情况下不作为参数。 sizeof
是一个操作符,数组名作为一个操作数。当数组名称是一元 &
运算符的操作数时,同样适用。
关于c - c中的数组名到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24467726/
这对你们来说可能很简单,但由于我是java新手,所以我想知道实际上什么是 接下来的部分会发生什么? if (args.length > 0) { file = args[0]; } publi
在我的 View Controller 中,我将 UITapGestureRecognizer 添加到 self.view。我在 self.view 之上添加了一个小 View 。当我点击小 View
我今天尝试从 Obj-C 开始并转到 Swift,我正在阅读文档。我试图在 Swift 中创建一个简单的 IBOutlet,但它不断给我这些错误。 View Controller 没有初始化器 req
我正在尝试使用 VIM 完成(字典和当前缓冲区),但我遇到了问题?和 !在方法名称的末尾。我能以某种方式向 vim 解释方法名称(基本上是单词)最后只能有它,而且只有一个,即 method_name
我是一名优秀的程序员,十分优秀!