关于初始化指针变量

时间:2013-06-13 10:50:52

标签: c

在C中,这些陈述:

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

int *c=123; 

最初都会给出错误/警告 c将保留任何垃圾值,并通过直接为该变量赋值,我可能正在访问受保护的内存。

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

char *c="jayesh";

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

我得到的警告:

警告:标量初始值设定项中的多余元素[默认启用]
    警告:初始化使得整数指针没有强制转换[默认情况下启用]

3 个答案:

答案 0 :(得分: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";

然后c将被创建为char的7元素数组,并且字符串文字的* contents *将被复制到它。

答案 1 :(得分:1)

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

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

如果您愿意,可以使用

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

因为这样就没有进行无效初始化,因为转换为{'q','w'}的{​​{1}}类型可以由char[]指向。

  

同意你对char * c的回答,但是通过指定char * c =“jay”   在这里我也定义了一个数组为c = {'j','a','y','\ 0'}所以最重要的是   这两者之间的基本区别除了'\ 0'

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

编译时,每个这样的字符串文字都存储在静态存储位置,并且完全是int,因此char array可以指向c类型。但是这不是那些数组char *语法的情况。因为,{'q','w'}可以是一个整数数组,也不首先将它转换为char [],它如何有资格进行赋值是{}的东西?例如,char *编译正常。因为指针算术受其受int p[]={'1','2'} type影响的类型的影响。size如果它是{'1','2'}数组且2*sizeof(int)需要int 1}}如果它是2*sizeof(char)数组。

答案 2 :(得分:0)

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