C 为什么我们需要地址操作符来访问二维字符串元素

C 为什么我们需要地址操作符来访问二维字符串元素,c,C,为什么我们需要address运算符来访问二维字符串元素,而对于简单数组,我们不需要。对于简单数组,我们只使用下标表示法 前 而对于数组,我们只使用 printf("%d",a[2][3]); 其中a是整数数组。在第二个printf中,打印单个int。在第一个printf中,您打印一个字符串,即char数组。原因很简单,当使用%s作为格式说明符调用printf时,它需要一个char*类型的参数,而不是将其与%d进行比较时所期望的char,因为names[2][0]不表示字符串,而是该字符串中的字

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

而对于数组,我们只使用

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

其中a是整数数组。

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

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

进行比较时所期望的
char
,因为
names[2][0]
不表示字符串,而是该字符串中的字符(在本例中,char
p
&names[2][0]
表示“给我该字符串中第一个字符的地址”,即字符串的开头


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

这是打印字符串的方法。在二维数组中存储字符串。即使是在一个简单的情况下,您有一个字符串,如
char*string=“Hello”您可以这样打印它:

printf(“%s”,字符串)其中字符串是指针。因此,当您要从数组中打印字符串时,需要获取其第一个元素的地址

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

如果有一个二维数组,其元素类型为char(如示例中所示),则可以使用下标运算符:

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

printf("\nOriginal: %s %s", names[2], names[3] ) ;  
名称[2]
名称[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] );

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

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

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


它也相当于
名称[3]
,因为它们都指向内存中的同一个位置。

OP说:“其中
a
是一个整数数组”。
a
是,但
a[2][3]
不是。你不需要
&
也不需要
[0]
。是的,这也解决了这个问题。
f( s );
f( &s[0] );