如何解决为什么我可以初始化 char 指针而不是 int pinter?
我在 1 年后回忆起我的 C 编程技能。所以我决定从头开始。我被指针卡住了
为什么我可以这样做:
char *string="Hello";
printf ("%s",string);
但我做不到:
int *pt=23;
printf("%d",*pt);
指针不需要是地址吗?但为什么第一个例子有效?
解决方法
因为使用字符串文字来初始化字符指针或数组是一种特殊的允许语法,具有特定的规则。在您的情况下,您将指针设置为指向字符串文字的地址,字符串文字本身具有 char[]
类型并存在于只读内存中。
对于整数情况,是的,它需要是一个地址,或者更具体地说是另一个整数指针。您不能用整数初始化指针。见:
"Pointer from integer/integer from pointer without a cast" issues
字符串文字“Hello”作为字符数组存储在内存中
char unnamed_literal[] = { 'H','e','l','o','\0' };
所以在这个声明中
char *string="Hello";
指针字符串被赋值为已经存在的数组的第一个字符的地址。它可以像
一样成像char unnamed_literal[] = { 'H','\0' };
char *string = unnamed_literal;;
至于本声明
int *pt=23;
那么值 23
不是指向程序中定义的有效对象的有效地址。编译器应该发出一条消息,表明您正在尝试将整数分配给指针。因此这个电话
printf("%d",*pt);
调用未定义的行为。
以通过字符串字面量初始化指针进行类比,您可以编写例如
int a[] = { 1,2,3 };
int *pt = a;
,
这是来自标准 C 的语法糖:
char 指针中实际存储的是启动程序时字符串在内存中加载的地址。
然而,对于整数,它会尝试将指针的地址设置为 23
,这是(并且应该是)无效的。
例如一个整数,如:
int VAL = 10;
int *ptr = &VAL; /* ptr now points to val */
*ptr = DESIRED_VALUE; /* *(asterisk) here means dereference,meaning that the value of VAL will change */
或
int *&VAL = DESIRED_VALUE;
,
int variable_1 = 23;
int *pointer_to_int = &variable_1;
第一行是一个整数变量,初始化为一个整数值。
第二行是整型变量的指针,初始化为整型变量的地址(变量variable_1
的地址,在前面的声明中定义。
char *p = "Charles Dickens";
这是一个 char
指针变量,初始化为字符串字面量的地址,它是一个常量字符数组,由引号之间的字符加上一个附加的 \0
字符组成,即表示字符串字面量的结尾。
char c = 'a'; /* char variable initialized to value 'a' */
char *pointer_to_c = &c;
您可能会发现最后一个声明与上面的声明非常相似。不同的是,在 C 中你可以使用字符串字面量,但单个字符类似于整数,这就是指针变量初始化的方式:使用变量地址。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。