在C中存储字符串的指针数组

时间:2016-01-08 07:37:43

标签: c arrays pointers

我是C语言的新手。最近我遇到了几个关于指针的问题。想寻求你的帮助。非常感谢〜

以下是代码块:

char *a[2];
a[0] = "blah";
a[1] = "hmm";
printf("%s %d\n", a[0],a[0]);
printf("%s %d\n", a[1], a[1]);

上述代码的输出是" blah",a [0]的地址," hmm"和[1]的地址。

第一个问题是:a [0]应该是一个指针,它应该包含一个地址。但是这里为[0]分配了一个字符串,这很奇怪。为什么会这样?

第二个问题是:a [0]是指针,因此printf("%d",a [0])将自然地打印a [0]的地址。但是,printf("%s",a [0])打印" blah",这是存储在地址中的字符串,其地址值等于[0]中存储的值]。直觉上我认为打印字符串的正确语法是使用printf("%s",*(a [0])),结果证明是执行错误。那么为什么printf("%s",[0])给出了所需的字符串结果呢?

期待您的回答,非常感谢您的帮助〜

2 个答案:

答案 0 :(得分:4)

  
      
  1. printf("%s%d \ n",a [0],a [0]);
  2.   

您应该使用%p来打印指针。 %d是打印整数。

  
      
  1. a [0]应该是一个指针,它应该包含一个地址。但是这里为[0]分配了一个字符串,这很奇怪。为什么会这样?
  2.   

是。 a[0]应该是一个指针,它应该包含一个地址。将a[0]分配给字符串是有效的,因为字符串常量是指向它的第一个成员的指针。即" blah"是指向b

的指针

验证:

printf("%p\n", "blah");  
  
      
  1. a [0]是指针,因此printf("%d",a [0])将自然地打印[0]的地址。但是,printf("%s",a [0])打印" blah",这是存储在地址中的字符串,其地址值等于[0]中存储的值]。
  2.   

printf("%p", a[0])将打印a[0]这个地址的值,printf("%s", a[0])将打印从地址a[0]开始线性存储的字符串。这是因为使用了format specifier

%p表示将值打印为地址(指针),%s表示打印从a[0]\0字符遇到的所有字符。

  
      
  1. 直觉我认为打印字符串的正确语法是使用printf("%s",*(a [0])),结果是执行错误。
  2.   

a[0]是一个指针,一个地址。我们在该地址存储了来自b的字符"blah"。因此*(a[0])的类型为char,而"%s"期望类型为char *(指向字符的指针)。所以类型不匹配。

获得清晰的想法:

printf("%c",*(a[0]));  

这将打印存储在a[0]的字符,因为我们正在使用a[0]运算符取消引用*

答案 1 :(得分:2)

字符串文字实际上是一个字符数组,包括终止空字符。并且作为所有数组,字符串文字数组可以衰减为指向其第一个元素的指针。

C中的所有字符串处理都使用指向第一个字符的指针,然后只需增加"索引"直到它找到终止字符。

另请注意,使用"%d"格式打印指针是 undefined ,您应该使用"%p"格式。