1

在 C 中,这些语句:

char *c={'q','w'};

int *c=123; 

两者都给出错误/警告,因为最初 c将持有任何垃圾值,并且通过将值直接分配给该变量,我可能正在访问受保护的内存。

但是当我定义指针时,它不会通过将其视为字符串来给出任何错误:

char *c="jayesh";

我无法弄清楚字符串定义背后的逻辑。请帮助我理解相同。

我得到的警告:

警告:标量初始值设定项中的多余元素[默认启用]
警告:初始化使指针从整数不进行强制转换[默认启用]

4

3 回答 3

2
char *c={'q','w'};

不起作用,因为c它不是数组,并且您不能在非数组对象上使用数组初始值设定项语法。

char *c=123;

不起作用,因为您试图将整数值 ( 123) 转换为没有强制转换的指针;注意

char *c = (char *) 123;

在初始化会成功的意义上“工作”,尽管123很可能不是有效的内存地址。

char *c = "jayesh";

之所以有效,是因为字符串文字就像"jayesh"是数组表达式,并且在大多数情况下,数组表达式将被转换为指针表达式,并且表达式的值将是数组第一个元素的地址。此规则的例外情况是数组表达式是一元运算符sizeof或一元运算符的操作数&,或者是用于在声明中初始化另一个数组的字符串文字。

所以发生的事情是第一个字符 ( 'j') 的地址被分配给c.

如果您的声明是

char c[] = "jayesh";

thenc将被创建为 的 7 元素数组char,并且字符串文字的 *contents * 将被复制到其中。

于 2013-06-13T11:09:51.493 回答
1

int *c存储整数变量的地址,但不存储整数值。这就是您收到错误/警告的原因。

char *c={'q','w'}是 c 中的无效初始化。因为,指针可以指向一块分配的内存。但是没有{'q','w'}以这种方式为自己分配内存。

如果你愿意,你可以使用

          `char *c=(char[]){'q','w'}`

因为,这种方式不会进行无效初始化,因为{'q','w'}类型转换为char[]可以指向的类型c

同意您对 char *c 的回答,但是通过在这里分配 char *c="jay" 我也将数组定义为 c={'j','a','y','\0'} 那么是什么除了 '\0' 之外,这两者之间的基本区别

因为,{'w','q'}char[]您使用char *p={'q','w'};. 但是当你使用时char *p="hello",类型string literal被解析为char array. 这就是C language定义string literals它们是字符流而不是ints 流或其他任何东西的方式。

编译时,每个这样的字符串文字都存储在静态存储位置,并且是完美的 a char array,因此可以通过cwhich 的类型来指向char *。但这些数组{}语法并非如此。因为,{'q','w'} 也可以是一个整数数组,而无需先将其转换为 char[],它如何有资格为它赋值char *?例如,int p[]={'1','2'}编译得很好。因为指针算术受其类型影响,受types影响size{'1','2'}需要2*sizeof(int)它是否是一个int数组,2*sizeof(char)如果它是一个char数组。

于 2013-06-13T10:55:58.627 回答
0

大多数指向用于确定 char 数组的类型的指针。准确地说,数组 - 这是一个指针/偏移量。当您创建一个变量时,char *ch这相当于char ch[]但您不能定义一个变量。您必须为数组指定固定大小。char ch[256]这是C字符串。假设您已经创建了一个变量并写入字符串,char ch[256] = "qwerty";您可以引用任何字符。ch[2](他们返回“e”)。在这种情况下 ch - 是指向数组开头的指针。并将ch[2]偏移量设置为 char 的 2 字节大小。

于 2013-06-13T11:11:50.070 回答