a905448839 发表于 2023-4-26 16:01:00

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

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


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

问题1:正确答案是A,但是D为什么不对呢?
问题2:如果这样定义char s={“ab”, “cd”}, *p=(char *)s;和 char s={“ab”, “cd”}, *p=&s;等价吗?

isdkz 发表于 2023-4-26 16:03:46

问题1:正确答案是A,但是D为什么不对呢?

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

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

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

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

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

char s = {"ab", "cd"};
char (*p) = &s;


在这种情况下,p 是一个指向二维字符数组的指针,而不仅仅是一个字符指针。这意味着你可以使用 p 这样的语法来访问数组中的元素。注意,这与将数组地址强制转换为字符指针的情况是不同的。

a905448839 发表于 2023-4-26 17:02:36

isdkz 发表于 2023-4-26 16:03
问题1:正确答案是A,但是D为什么不对呢?

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

那如果这样定义char s={“ab”, “cd”}, *p=(char *)s;和 char s={“ab”, “cd”}, *p=s;等价吗?

isdkz 发表于 2023-4-26 17:16:02

a905448839 发表于 2023-4-26 17:02
那如果这样定义char s={“ab”, “cd”}, *p=(char *)s;和 char s={“ab”, “cd”}, *p=s ...

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

定义1:

char s = {"ab", "cd"};
char *p = (char *)s;


定义2:

char s = {"ab", "cd"};
char *p = s;


在两种情况下,字符指针 p 都被初始化为指向 s 的首地址。在C语言中,数组名(在这里是 s)在大多数上下文中被视为指向其第一个元素的指针。因此,在定义2中,将 s 赋值给 p 会使 p 指向 s。这与定义1中将数组地址强制转换为字符指针的结果相同。

陶远航 发表于 2023-4-29 12:23:48

问题1:D选项不正确的原因是因为p是一个char类型的指针,因此p表示s,而不是s。因此,p实际上是*(p+1),它的值与s不同。

问题2:这两种定义是不等价的。在第一个定义中,p被初始化为指向s的第一行的第一个元素,即p指向s。而在第二个定义中,p被初始化为s的地址,即p指向整个s数组的起始地址。因此,这两个定义的结果是不同的,因为它们指向的内存位置不同。此外,第二个定义也不符合语法规则,因为p是一个指向char的指针,而&s是一个指向整个二维数组的指针,它们类型不同,因此不能进行赋值。
页: [1]
查看完整版本: 若定义 char s[2][3]={“ab”, “cd”}, *p=(char *)s; 那么下列表达式语法正确?