我是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])给出了所需的字符串结果呢?
期待您的回答,非常感谢您的帮助〜
答案 0 :(得分:4)
- printf("%s%d \ n",a [0],a [0]);
醇>
您应该使用%p
来打印指针。 %d
是打印整数。
- a [0]应该是一个指针,它应该包含一个地址。但是这里为[0]分配了一个字符串,这很奇怪。为什么会这样?
醇>
是。 a[0]
应该是一个指针,它应该包含一个地址。将a[0]
分配给字符串是有效的,因为字符串常量是指向它的第一个成员的指针。即" blah"是指向b
验证:
printf("%p\n", "blah");
- a [0]是指针,因此printf("%d",a [0])将自然地打印[0]的地址。但是,printf("%s",a [0])打印" blah",这是存储在地址中的字符串,其地址值等于[0]中存储的值]。
醇>
printf("%p", a[0])
将打印a[0]
这个地址的值,printf("%s", a[0])
将打印从地址a[0]
开始线性存储的字符串。这是因为使用了format specifier
。
%p
表示将值打印为地址(指针),%s
表示打印从a[0]
到\0
字符遇到的所有字符。
- 直觉我认为打印字符串的正确语法是使用printf("%s",*(a [0])),结果是执行错误。
醇>
a[0]
是一个指针,一个地址。我们在该地址存储了来自b
的字符"blah"
。因此*(a[0])
的类型为char
,而"%s"
期望类型为char *
(指向字符的指针)。所以类型不匹配。
获得清晰的想法:
printf("%c",*(a[0]));
这将打印存储在a[0]
的字符,因为我们正在使用a[0]
运算符取消引用*
。
答案 1 :(得分:2)
字符串文字实际上是一个字符数组,包括终止空字符。并且作为所有数组,字符串文字数组可以衰减为指向其第一个元素的指针。
C中的所有字符串处理都使用指向第一个字符的指针,然后只需增加"索引"直到它找到终止字符。
另请注意,使用"%d"
格式打印指针是 undefined ,您应该使用"%p"
格式。