为什么我们需要地址运算符来访问二维字符串元素

时间:2014-08-12 13:26:47

标签: c

为什么我们需要地址运算符来访问二维字符串元素,而在简单数组的情况下我们不需要。我们只是在简单数组的情况下使用下标表示法 对于前

char  masterlist[6][10] = {
       "akshay",
       "parag",
       "raman",
       "srinivas", 
       "gopal",
       "rajesh"
         };

printf("\nOriginal: %s %s", &names[2][0], &names[3][0] ) ;  

而在数组的情况下,我们只使用

printf("%d",a[2][3]);

其中a是整数数组。

6 个答案:

答案 0 :(得分:2)

原因很简单,因为当用printf作为格式说明符调用%s时,它需要一个类型为char *的参数,而不是char的参数。如果将其与%d进行比较。

答案 1 :(得分:1)

格式说明符%s用于输出字符串 - 即字符序列 - 以空字符'\0'结尾。

如果你有一个二维数组,其元素类型为char,如你的例子所示,那么你可以使用下标运算符:

char  masterlist[6][10] = {
       "akshay",
       "parag",
       "raman",
       "srinivas", 
       "gopal",
       "rajesh"
         };

printf("\nOriginal: %s %s", names[2], names[3] ) ;  

names[2]names[3]都有char [10]类型,代表字符串。

如果要在使用以下语句时与整数数组进行比较:

printf("%d",a[2][3]);

然后输出数组的元素。您可以为原始字符数组编写相同的方法:

printf("%c", names[2][3] ) ;

此语句将输出字符'a'(如果我没有记错的话)。

如果要输出整个字符串而不是数组中的单个元素,则必须使用上面显示的代码。

考虑一个简化的例子。我们假设有一个函数

void f( const char s[10] );

此函数声明等同于

void f( const char *s );

并且两者都声明了相同的一个函数。

这是一个作为函数参数传递的数组,将调整为指向其第一个元素的指针。如果你有一个数组

char s[10] = "Hello";

然后这些表达式是等价的

f( s );
f( &s[0] );

两者都传递一个指向数组第一个元素的指针。

答案 2 :(得分:0)

在第二个printf中,您打印一个int。在第一个printf中,您打印一个字符串,即char 数组

答案 3 :(得分:0)

因为names[2][0]不代表字符串,所以它是来自该字符串的字符(在本例中为char p)。 &names[2][0]表示"给我字符串中第一个字符的地址",即。字符串的开头。

该语言需要一个指向char的指针作为字符串。

答案 4 :(得分:0)

这是打印字符串的方法。在二维数组中,您可以存储字符串。即使在你有一个像char *string="Hello";这样的字符串的简单情况下,你也会像这样打印它:     printf("%s", string);其中string是指针。因此,当您想要从数组中打印字符串时,您需要获取其第一个元素的地址。

答案 5 :(得分:0)

要打印出一个字符数组(一个字符串),您需要为该函数提供该数组的第一个值(索引0)。

因此你说的是&names[3][0],它基本上返回数组names中第4个数组的第一个元素。

它也等同于names[3],因为它们都指向内存中的相同位置。