char的指针数组怎么能保存字符串而不是地址?

时间:2016-09-18 12:00:30

标签: c arrays pointers

任何人都可以解释以下程序的工作原理吗?这里name[]是一个指向char的指针数组,那么name如何包含值而不是地址?如何存储的值是字符串而不是字符?

#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; 
}

2 个答案:

答案 0 :(得分:2)

"Zara Ali"这样的字符串文字计算其第一个字符的地址。

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

基本上你的数组包含地址

你也可以写

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

答案 1 :(得分: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是一个指向char的指针(类似于你的names[i],也是一个指向char的指针)。实际上s可以解释为1)地址,2)指向char的普通指针,或3)字符串。

首先s是一个指针,因此s保存它所指向的地址。您可以使用printf控件字符串查看第一个%p的地址。

其次,s是一个指向char的指针,所以你可以正常使用它来使用printf %c,这将打印第一个字符。

第三,s是指向char的指针,这是声明C string的另一种方式(另一种方式是使用数组)。 C字符串是以\0结尾的连续字符数组作为分隔符。使用printf %s时,您将其打印为字符串。