如何指向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时,您将其打印为字符串。

+0

使用s作为字符我们写“printf(”s =%c \ n“,* s);”对于字符串,我们写“printf(”s =%s \ n“,s);”。为什么要打印我们使用的字符* s和仅字符串s? –

+0

你不是新手(即你可以投票),考虑接受答案的投票 – artm

甲文字等"Zara Ali"串计算为它的第一个字符的地址。

字符串文字通常存储在只读数据段中。

所以基本上你的数组包含地址

你也可以写

char *str="Zara Ali"; 
//The value of a string literal is the address of its first character. 
+0

你可以更详细地解释一下你实际上的意思是什么?“字符串的值是它的第一个字符的地址。” “? –

+0

@sameersoin考虑一个字符串“Ali”。它将被存储在内存中,并将在只读段中占用4个字节的内存(第4个字节用于存储''\ 0'')。当你写“Ali”时,它意味着第一个字节的地址。所以'char * ptr =“Ali”;'会将第一个字节的地址赋给'ptr'。 – Raman