C 关于初始化指针变量
在C中,这些陈述:C 关于初始化指针变量,c,C,在C中,这些陈述: char *c={'q','w'}; 及 两者都给出了错误/警告,因为最初 c将保存任何垃圾值,通过直接为该变量赋值,我可能正在访问受保护的内存 但当我定义指针时,将其视为字符串不会给出任何错误: char *c="jayesh"; 我无法理解字符串定义背后的逻辑。请帮我理解同样的道理 我得到的警告是: 警告:标量初始值设定项中的元素过多[默认启用] 警告:初始化从整数生成指针而不使用强制转换[默认启用]int*c存储整数变量的地址,但不存储整数值。这就是为什么会出现错误
char *c={'q','w'};
及
两者都给出了错误/警告,因为最初
c
将保存任何垃圾值,通过直接为该变量赋值,我可能正在访问受保护的内存
但当我定义指针时,将其视为字符串不会给出任何错误:
char *c="jayesh";
我无法理解字符串定义背后的逻辑。请帮我理解同样的道理
我得到的警告是:
警告:标量初始值设定项中的元素过多[默认启用]警告:初始化从整数生成指针而不使用强制转换[默认启用]
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”之外,这两个选项之间的基本差异 因为,当您使用
char*p={'q','w'}时,{/code>的类型未解析为char[]
代码>。但是,当您使用char*p=“hello”
时,string-literal
的类型被解析为char-array
。这就是C语言
如何定义string文本
它们是字符流,而不是int
s流或其他任何东西
编译时,每一个这样的字符串文本都存储在静态存储位置,完全是一个char数组
,因此可以由c
指向,它属于char*
类型。但是那些数组{}
语法并非如此。因为,{'q','w'}可以是整数数组,也不需要首先将其转换为char[],它如何有资格被赋值为char*
?例如,intp[]={'1','2'}
编译得很好。由于的指针算法受其类型的影响,而该类型受类型大小{'1','2'}
如果是int
数组,则取2*sizeof(int)
,如果是char
数组,则取2*sizeof(char)
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*复制到该数组中 大多数指向用于确定字符数组的类型的指针。准确地说,数组-这是指针/偏移量。当您创建变量char*ch
时,这相当于char ch[]
但您不能定义变量。必须为数组指定固定大小charch[256]
这是C字符串。假设您创建了一个变量并写入字符串charch[256]=“qwerty”代码>您可以引用任何字符ch[2]
(返回“e”)。在本例中,ch-是指向数组开头的指针。和ch[2]
将偏移量设置为char的2字节大小。同意你关于char*c的回答,但是通过在这里赋值char*c=“jay”,我也将数组定义为c={j','a','y','\0'},那么除了'\0'之外,这两者之间的基本区别是什么呢?得到了大部分信息,但如果我错了,请纠正我。通过执行char*c=(char[]){'q','w'}我正在将'q'的地址分配给c(这是指针变量),在前面的表达式“char*c={'q','w'}”中,c变量需要一个地址,但我正在分配一个数组给它。@jayeshhathila是的,您正在分配q
和char*c={'q','w}的地址
c变量需要字符的地址…..但是编译器不知道{'q','w'}是char还是int类型或者其他…实际上您没有使用正确的类型进行严格初始化…..这可能是因为char*c={'q','w'}
不可能,尽管char*p=“hello”
是可能的…我希望这可能是语言设计师这样做的原因…我不知道他们的实际意图,尽管你应该给出你得到的警告。Char ch[]=“qwerty”也会起作用。如果我在声明点定义字符串,我不需要声明大小。
char c[] = "jayesh";