鱼C论坛

 找回密码
 立即注册
查看: 1076|回复: 4

[已解决]若定义 char s[2][3]={“ab”, “cd”}, *p=(char *)s; 那么下列表达式语法正确?

[复制链接]
发表于 2023-4-26 16:01:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
若定义 char s[2][3]={“ab”, “cd”}, *p=(char *)s; 那么下列表达式语法正确,并且其值与 s[1][1]相等的表达式(并非一定与其等价)是


A.
*(p+4)
B.
*(p+3)
C.
*s+2
D.
p[1][1]

问题1:正确答案是A,但是D为什么不对呢?
问题2:如果这样定义char s[2][3]={“ab”, “cd”}, *p=(char *)s;  和 char s[2][3]={“ab”, “cd”}, *p=&s;等价吗?
最佳答案
2023-4-26 17:16:02
a905448839 发表于 2023-4-26 17:02
那如果这样定义char s[2][3]={“ab”, “cd”}, *p=(char *)s;  和 char s[2][3]={“ab”, “cd”}, *p=s ...

是的,这两个定义是等价的。在这两种情况下,字符指针 p 都指向了二维字符数组 s 的第一个元素,即 s[0][0]。

定义1:
char s[2][3] = {"ab", "cd"};
char *p = (char *)s;

定义2:
char s[2][3] = {"ab", "cd"};
char *p = s;

在两种情况下,字符指针 p 都被初始化为指向 s 的首地址。在C语言中,数组名(在这里是 s)在大多数上下文中被视为指向其第一个元素的指针。因此,在定义2中,将 s 赋值给 p 会使 p 指向 s[0][0]。这与定义1中将数组地址强制转换为字符指针的结果相同。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-26 16:03:46 | 显示全部楼层
问题1:正确答案是A,但是D为什么不对呢?

答:在这个例子中,我们已经定义了一个二维字符数组 s[2][3],并将它的地址强制类型转换为字符指针。由于每个数组元素占用一个字节,因此 s[1][1] 对应于数组中第4个元素(索引从0开始),即字符 'd'。在这个情况下,我们可以使用不同的表达式来访问这个元素。

对于选项A,*(p+4) 是正确的,因为它将指针 p 向前移动 4 个字节,然后解引用该指针以获得 'd'。

选项D,p[1][1] 是错误的,因为它试图将 p 当作一个二维字符数组的指针。但实际上,p 是一个字符指针。在C语言中,指针和数组有一定的相似性,但它们在语法上是不同的。因此,p[1][1] 这个表达式在这种情况下是不正确的。

问题2:如果这样定义char s[2][3]={“ab”, “cd”}, *p=(char *)s;  和 char s[2][3]={“ab”, “cd”}, *p=&s;等价吗?

答:它们不等价。首先,*p=&s; 的语法是错误的,因为 &s 的类型是一个指向二维数组的指针,即 char (*)[2][3]。要正确赋值,你需要将 p 定义为一个指向二维数组的指针,如下所示:
char s[2][3] = {"ab", "cd"};
char (*p)[2][3] = &s;

在这种情况下,p 是一个指向二维字符数组的指针,而不仅仅是一个字符指针。这意味着你可以使用 p[0][1][1] 这样的语法来访问数组中的元素。注意,这与将数组地址强制转换为字符指针的情况是不同的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-26 17:02:36 From FishC Mobile | 显示全部楼层
isdkz 发表于 2023-4-26 16:03
问题1:正确答案是A,但是D为什么不对呢?

答:在这个例子中,我们已经定义了一个二维字符数组 s[2][3] ...

那如果这样定义char s[2][3]={“ab”, “cd”}, *p=(char *)s;  和 char s[2][3]={“ab”, “cd”}, *p=s;等价吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-26 17:16:02 | 显示全部楼层    本楼为最佳答案   
a905448839 发表于 2023-4-26 17:02
那如果这样定义char s[2][3]={“ab”, “cd”}, *p=(char *)s;  和 char s[2][3]={“ab”, “cd”}, *p=s ...

是的,这两个定义是等价的。在这两种情况下,字符指针 p 都指向了二维字符数组 s 的第一个元素,即 s[0][0]。

定义1:
char s[2][3] = {"ab", "cd"};
char *p = (char *)s;

定义2:
char s[2][3] = {"ab", "cd"};
char *p = s;

在两种情况下,字符指针 p 都被初始化为指向 s 的首地址。在C语言中,数组名(在这里是 s)在大多数上下文中被视为指向其第一个元素的指针。因此,在定义2中,将 s 赋值给 p 会使 p 指向 s[0][0]。这与定义1中将数组地址强制转换为字符指针的结果相同。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-29 12:23:48 | 显示全部楼层
问题1:D选项不正确的原因是因为p是一个char类型的指针,因此p[1]表示s[1],而不是s[1][0]。因此,p[1][1]实际上是*(p[1]+1),它的值与s[1][1]不同。

问题2:这两种定义是不等价的。在第一个定义中,p被初始化为指向s的第一行的第一个元素,即p指向s[0][0]。而在第二个定义中,p被初始化为s的地址,即p指向整个s数组的起始地址。因此,这两个定义的结果是不同的,因为它们指向的内存位置不同。此外,第二个定义也不符合语法规则,因为p是一个指向char的指针,而&s是一个指向整个二维数组的指针,它们类型不同,因此不能进行赋值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-27 23:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表