C 关于初始化指针变量

C 关于初始化指针变量,c,C,在C中,这些陈述: char *c={'q','w'}; 及 两者都给出了错误/警告,因为最初 c将保存任何垃圾值,通过直接为该变量赋值,我可能正在访问受保护的内存 但当我定义指针时,将其视为字符串不会给出任何错误: char *c="jayesh"; 我无法理解字符串定义背后的逻辑。请帮我理解同样的道理 我得到的警告是: 警告:标量初始值设定项中的元素过多[默认启用] 警告:初始化从整数生成指针而不使用强制转换[默认启用]int*c存储整数变量的地址,但不存储整数值。这就是为什么会出现错误

在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";