1
 #include <stdio.h>

  int main(void){

  char *p = "Hello";  
  p = "Bye";              //Why is this valid C code? Why no derefencing operator?

  int *z;
  int x;
  *z = x
  z* = 2                 //Works
  z  = 2                 //Doesn't Work, Why does it work with characters?

 char *str[2] = {"Hello","Good Bye"};

 print("%s", str[1]);      //Prints Good-Bye.     WHY no derefrencing operator?
                          // Why is this valid C code? If I created an array with pointers
                         // shouldn't the element print the memory address and not the string?
  return 0;

  }

评论中概述了我的问题。在一般情况下,我无法理解字符数组和指针。特别是为什么我可以在没有取消引用运算符的情况下访问它们。

4

5 回答 5

2

在一般情况下,我无法理解字符数组和指针。

这对于初级 C 程序员来说很常见。大约在 1985 年,我也有同样的困惑。

p = "Bye";

由于 p 被声明为 char*,p 只是一个包含 char 内存地址的变量。上面的赋值将 p 的值设置为常量字符串“Bye”的第一个字符的地址,即字母“B”的地址。

z  = 2

z 被声明为 char*,因此您唯一可以分配给它的是 char 的内存地址。您不能将 2 分配给 z,因为 2 不是 char 的地址,它是一个常量整数值。

print("%s", str[1]);

在这种情况下,str 被定义为两个 char* 变量的数组。在您的打印语句中,您将打印其中的第二个,即字符串“Good Bye”中第一个字符的地址。

于 2013-01-15T03:30:13.457 回答
1

当您键入“Bye”时,您实际上是在创建所谓的String Literal。这是一个特例,但本质上,当你这样做时

p = "Bye";

您正在做的是将此 String 文字的地址p分配给(字符串本身由编译器以与实现相关的方式存储(我认为))。正如 Richard J. Ross III 解释的那样,从技术上讲,它指向 char 数组的第一个元素。

由于它是一种特殊情况,它不适用于其他类型。

顺便说一句,您可能会收到编译器警告,例如char *p = "Hello";. 您应该需要定义它们,const char *p = "Hello";因为修改它们是未定义的链接解释。


至于打印代码。

print("%s", str[1]); 

不需要解引用操作,因为内部%s需要传递一个指针(特别char *是),因此解引用由printf. 当 printf 需要一个指针时,您可以通过传递一个值来测试它。当它试图取消引用它时,您应该会遇到运行时崩溃。

于 2013-01-15T03:25:36.077 回答
0
 p = "Bye"; 

是将文字的地址分配给指针。

array[n]

运算符的工作方式与将指针“array”的取消引用增加 n 类似。它不一样,但它是这样工作的。

于 2013-01-15T03:27:52.740 回答
0

请记住"Hello""Bye"一切都不char *char
所以这一行,p="Bye";意味着指针 p 指向一个const char *ie"Bye"
但在下一种情况下, withint *
*z=2意味着

`z` 指向的`int` 被赋值为 2

而,z=2意味着指针z指向同一个int,由.指向2。但是,2不是int pointer指向其他ints。所以,编译器标记错误

于 2013-01-15T03:29:32.940 回答
-1

你混淆了一些东西:它确实适用于字符,就像它适用于整数等一样。

不适用于字符串,因为它们是字符数组,并且数组只能使用它们的第一个元素的地址存储在变量中。

稍后,您创建了一个字符指针数组或字符串数​​组。这意味着该数组的第一个元素是一个字符串,第二个元素也是一个字符串。当涉及到打印部分时,您使用的是数组的第二个元素。因此,不出所料,第二个字符串被打印出来。

如果你这样看,你会发现语法是一致的。

于 2013-01-15T03:28:44.087 回答