如何指向char的指针数组保存字符串而不是地址?
任何人都可以解释以下程序的工作原理吗?这里name[]
是一个指向char的指针数组,那么name如何包含值而不是地址,以及如何将所存储的值存储为字符串而不是字符?如何指向char的指针数组保存字符串而不是地址?
#include <stdio.h>
const int MAX = 4;
int main() {
char *names[] = {
"Zara Ali",
"Hina Ali",
"Nuha Ali",
"Sara Ali", };
int i = 0;
for (i = 0; i < MAX; i++) {
printf("Value of names[%d] = %s\n", i, names[i]);
}
return 0;
}
你可以采取简单的例子:
char *s = "abcd";
printf("s = %p\n", (void *)s); // 1) address
printf("s = %c\n", *s); // 2) char
printf("s = %s\n", s); // 3) string
这里s
是字符指针(类似于您names[i]
,也是一个字符指针)。实际上s
可以解释为1)一个地址,2)一个正常的字符指针,或者3)一个字符串。
第一个s
是一个指针,因此s
保存它指向的地址。您可以使用%p
控制字符串来检查第一个printf
的地址。
第二,s
是一个指向char的指针,所以你可以照常使用它,使用printf %c
这将打印第一个字符。
三,s
是一个指向char的指针,这是一种声明C string
(另一种方法是使用数组)的方法。 C字符串是以\0
作为分隔符结尾的连续字符数组。使用printf %s
时,您将其打印为字符串。
甲文字等"Zara Ali"
串计算为它的第一个字符的地址。
字符串文字通常存储在只读数据段中。
所以基本上你的数组包含地址。
你也可以写
char *str="Zara Ali";
//The value of a string literal is the address of its first character.
你可以更详细地解释一下你实际上的意思是什么?“字符串的值是它的第一个字符的地址。” “? –
@sameersoin考虑一个字符串“Ali”。它将被存储在内存中,并将在只读段中占用4个字节的内存(第4个字节用于存储''\ 0'')。当你写“Ali”时,它意味着第一个字节的地址。所以'char * ptr =“Ali”;'会将第一个字节的地址赋给'ptr'。 – Raman
使用s作为字符我们写“printf(”s =%c \ n“,* s);”对于字符串,我们写“printf(”s =%s \ n“,s);”。为什么要打印我们使用的字符* s和仅字符串s? –
你不是新手(即你可以投票),考虑接受答案的投票 – artm