几乎每个读这篇文章的人都熟悉这三个关于C的关键事实:
[]与指针一样适用于指针.这三个事实绝对是C中数组和指针处理的核心.它们甚至不是三个独立的事实; 它们是一个中心概念的相互关联的方面.如果没有对这个概念的正确理解,就不可能正确地进行相当基本的C编程.
我今天的问题很简单,这个概念的名称是什么?
我以为我是老式的,但我总是把它称为"C中数组和指针之间的等价",或简称为"数组/指针等价".但我知道你几乎不能在SO上说出这些话; 他们几乎是禁忌.
这可能看起来像一个抽象或哲学问题,所以更具体地构建它,我正在寻找的是一个简单的名词或名词短语我可以在句子中使用"是的,由于_____,数组下标可以被认为是作为指针算术的语法糖",回答,比方说,这个问题.
(但是请注意,我不是在寻找这个问题的答案,也不是为了回答"'等价'这个词有什么问题?".是的,我知道,它会误导学习者想象数组和指针是某种方式同样.当我写这个FAQ列表条目时,我确实有这种困惑.)
最近,我看到一个问题的答案,他们解释说,以这种方式寻址数组<number>[array]是有效的C代码。
方括号在C中如何工作?
例:
char x[] = {'A','B','C','D','E','F','G','H','I','J'};
printf("%d\n",5[X]);
//Will print 70 == 'F'
Run Code Online (Sandbox Code Playgroud)
对于包括作者在内的每个人来说,这种表示法似乎都很麻烦并且可能会造成混淆。
这种寻址数组的方式是否具有某些合理的优势?
要么
我可以继续生活而不用担心吗?
我读了很多关于这个主题的回复,但我仍然无法理解。请理解我正在学习过程中。
有人告诉我,向量只不过是它的第一个元素地址,因此是一个二维向量。
那么,为什么如果我通过指针传递 2D 向量,我就会失去使用索引的能力。
int vec[10][10] = { 1, 2, 3, 4 };
int *v = vec;
Run Code Online (Sandbox Code Playgroud)
为什么我不能说
int a = v[1][1]
Run Code Online (Sandbox Code Playgroud)
就像我会做的那样
int a = vec[1][1]
Run Code Online (Sandbox Code Playgroud)
if v,那是一个指向int, 的指针,而vec, 那是一个指向int, 的指针,那么它们不是完全相同的东西,同一个对象吗?
我读到
int (*v)[N] = vec;
Run Code Online (Sandbox Code Playgroud)
其中N是列数。但这对于初学者来说似乎是一件超级棘手的事情。
为什么是这样?
编辑:
我的大脑想到了这个解释,int (*vec)[N]解释了指向向量 10 的指针的int含义。这里是。
鉴于我的理解,在二维数组中,指向第一个元素的指针是指向N元素数组的指针,这是我给自己的解释。
如果 lhs ofint *var = &int必须从右到左读取,变成“ varis a pointerto int”,那么我期望int [N] …
根据我的理解,char* X是C中指向单个字符或字符数组(字符串)的变量。
char**是一个指向另一个指针的指针,该指针最终指向单个字符或字符数组。
ifint**相当于创建多维数组,为什么我不能使用 C 创建字符串数组char**?
const char** day = {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
};
Run Code Online (Sandbox Code Playgroud)
这里*day会指向数组本身并**day会指向数组的第一个元素“Sunday”?
我们有变量a,即类型char*,将chars存储在数组中。*(a + 2)和如何a[1]相关?
a[1]指向数组中的第二个元素,并*(a + 2)指向 指向的元素之后的第二个元素a。那么这两者的值会相同吗?
我对 C 语法感到困惑。如果我分配内存:
int* x = (int*)malloc(1 * sizeof(int));
Run Code Online (Sandbox Code Playgroud)
int 指针的这两个代码片段是否相等?
*x = 0;
Run Code Online (Sandbox Code Playgroud)
和
x[0] = 0;
Run Code Online (Sandbox Code Playgroud)