C:关于char*的许多问题



我对有问题的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 [])

{

}并找出如何正确称其为您自己的

最新更新