我对有问题的C程序(arrays-pointers.c
)有很多问题:
#include <stdio.h>
int main(void) {
char * vowels = {'A', 'E', 'I', 'O', 'U'};
printf("sizeof(vowels): %dn", sizeof(vowels));
}
i用GCC(gcc arrays-pointers.c -o arrays-pointers.exe
)编译,我会收到警告(但不是完全错误):
In function 'main':
warning: initialization of 'char *' from 'int' makes pointer from integer
without a cast [-Wint-conversion]
char * vowels = {'A', 'E', 'I', 'O', 'U'};
^~~
note: (near initialization for 'vowels')
warning: excess elements in scalar initializer
char * vowels = {'A', 'E', 'I', 'O', 'U'};
^~~
note: (near initialization for 'vowels')
warning: excess elements in scalar initializer
char * vowels = {'A', 'E', 'I', 'O', 'U'};
^~~
note: (near initialization for 'vowels')
warning: excess elements in scalar initializer
char * vowels = {'A', 'E', 'I', 'O', 'U'};
^~~
note: (near initialization for 'vowels')
warning: excess elements in scalar initializer
char * vowels = {'A', 'E', 'I', 'O', 'U'};
^~~
note: (near initialization for 'vowels')
尽管有这些警告,但海湾合作委员会仍会产生一个始终输出的可执行文件:
sizeof(vowels): 8
我的问题是:
- 如果指针和数组相似,为什么我不能以这种方式初始化数组?
- 警告是什么意思?
- 为什么
sizeof(vowels)
总是8?
这对理解不是微不足道的,因为c中的数组是"奇怪"的;仅出于历史原因,它们是一种"特殊情况"。
您需要知道的是,数组和指针根本不是同一回事。数组是一个接一个多个元素的内存块,指针是其他东西的地址。
造成某种困惑的是,在许多地方,如果您使用数组,则C语言考虑到数组,将指针指向数组的第一个元素(在Legalese中,使用的短语是"数组腐烂到指向指向的指针第一个元素")。
例如
int x[] = {1, 2, 3}; // x is an array
foo(x); // you cannot pass an array, a pointer to x[0] is passed instead
因此您的代码不复存在,因为就像
int *x = {1, 2, 3}; // Invalid: {1, 2, 3} is not a valid initializer for a pointer
相反,令人惊讶的是,这是有效的
int x[] = {1, 2, 3}; // An array
int *y = x; // Fine, it's like writing int *y = &x[0];
在第二个示例中,y
的初始化是有效的,因为在此上下文中,有一个规则将数组自动"衰减"到指向第一个元素的指针中。
这种混乱之所将结构作为参数传递,并从函数返回结构...即使结构包含数组)。现在修复这种不合逻辑的不对称性现在就不可思议了,通过更改现有代码的含义来打破大多数现有的C或C 程序。
不幸的是,c和c 都充满了这些奇怪的不合逻辑规则,这就是为什么通过实验学习C或C 是一个坏主意(对于C,这是一个坏主意,但由于其大小很小,但对于C 而言,这是一个坏主意,但它是一个c 自杀是因为它实际上是一个不合逻辑的陷阱的雷区,也是一个巨大的陷阱)。
要学习C或C ,您需要阅读规则。
不要试图太聪明而猜测(猜猜正确的答案是不合逻辑的)。
您可以通过创建字符的数组,然后用其地址分配指针来初始化它。这种对象称为复合文字。
char * vowels = (char []){'A', 'E', 'I', 'O', 'U'};
如果指针和数组相似,为什么我不能初始化数组 这样?
从技术上讲,它们并不完全相似。您可以添加手动操作以使指针的作用像数组一样,但它们并不相同。
为什么sizeof(元音)总是8?
是64位系统上指针的大小。
首先,因为已经说过32位体系结构中的sizeof(int)= 4个字节或64位体系结构中的8个字节,它与记忆量有关您的系统需要编码整数。也就是说,您必须了解C中指针和数组的相似性。数组是保存在内存中连续地址中的相同类型的元素集合。我们可以使用指向第一个字节的指针访问它。因此:
int a [5];不是一个指针,而只是一个数组,&amp; a or&&&&&&&&&&&&&&&&&&&&&&&&amp; a [0](该符号在c中具有相同的含义)是阵列的启动指针(如果愿意,可以将其称为头)。p> a [1]表示数组的第二个元素,它的地址(或指向它的指针)是&amp;(a sizeof(int))==&amp;(a 4)在32位机器或软件中模仿它(例如,Netbeans)。
将数组传递到函数:
第一条方法:
void readtheTheyory(int *arr){
}
并将其称为ReadTheTheTheYory(A)或ReadTheTheEory(&amp; a [0])
第二路
void readtheth(int a [])
{
}并找出如何正确称其为您自己的