c - C中将字符串赋值给字符指针的解释

标签 c string pointers

我对指针非常困惑。如果我们创建一个类型为“char”的指针变量,它类似于 char *ch; 并为其分配一个字符数组。然后我们可以通过增加指针(++ch)来访问字符串中的每个字母。

char *ch;
char a[5]="hello";
*ch=a;
while(*ch) {
  printf("%c",*ch);
  ++ch;
}

这工作得很好。但我看到很多例子,比如,

struct example {
  char *ch;
};

int main() {
  struct example ex={"hello"};
  printf("%s",ex.ch);
}

我对这个例子很困惑,比如直接将字符串分配给字符指针(而不是将字符串分配给变量,然后再将其分配给字符指针)如何使其可访问。在前面的例子中,*ch 指向数组“a”的起始内存。但是在第二种情况下,指针 ch 指向哪个内存呢?谁能给我一个明确的解释?

最佳答案

当你做这个作业时

ch=a;

您正在将指针 ch 设置为字符数组 a[] 的开头(注意:数组仍然以 null 结尾的事实纯属巧合 -你的代码有未定义的行为,因为 "hello" 末尾的第六个字符 '\0' 没有被复制到一个五字符数组中)。赋值后 ch 成为存储在数组 a[] 中的 C 字符串的“别名”,这意味着您可以将它用于字符串操作和格式化例程。

你的第二个例子不是赋值,而是初始化:

struct example ex={"hello"};

用大括号括起来的是一个初始化器。 C 编译器将获取每个元素(您只有一个,但可以有很多)并将其分配给 struct 的相应字段。在这种情况下,字符串文字 "hello" 被分配给 ch 成员。

初始化器的规则是按声明顺序在花括号中赋值。如果您愿意,您可以使用 C99 的指定初始化程序功能来覆盖它:

struct example ex={ .ch = "hello"};

关于c - C中将字符串赋值给字符指针的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24743443/

相关文章:

c - 函数使用相同的内存进行本地指针初始化?

c++ - 高效计算 32 位整数乘法的高阶位

c - 如何计算 udp 数据包大小 libpcap

从 C 中的另一个数组创建数组

c# - 有什么方法可以改进这个字符串切片方法吗?

ios - 使用 Swift 提取字符串中的最后一个单词

c++ - `std::string::iterator` 保证不是指向 char 的指针吗?

c - 在 C 中解析逗号分隔的文件

c - 在c中显示格式化的二叉树

c - 在 C 中获取 typedef 的名称?