在C中,这些陈述:
char *c={'q','w'};
和
int *c=123;
最初都会给出错误/警告
c
将保留任何垃圾值,并通过直接为该变量赋值,我可能正在访问受保护的内存。
但是当我定义指针时,它不会通过将其视为字符串来给出任何错误:
char *c="jayesh";
我无法弄清楚字符串定义背后的逻辑。请帮我理解一下。
我得到的警告:
警告:标量初始值设定项中的多余元素[默认启用]
警告:初始化使得整数指针没有强制转换[默认情况下启用]
答案 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个字节大小。