首页 > 试题广场 >

以下复制语句错误的是?

[单选题]
若有定义语句:char s[3][10],(*k)[3],*p;则以下赋值语句错误的是()
1.p = s;
2.p = k;
3.p = s[0]; 
4.k = s;
  • 124
  • 1234
  • 12
  • 234
p 是指向 char 的指针
k 是指向 char数组的指针,数组大小为3
s 是指向 char数组的指针,数组大小为10

k=s 错误是因为,k和s指向的数组大小不同。
k+1 地址移动3个 char的大小
s+1 地址移动10 个char的大小

如果将s 的定义改成 char s[3][3],那么 k=s 就正确了
或者将k 的定义改成 char (*k)[10],那么 k=s 也正确

另外附上两个复杂指针解析的链接:
http://blog.csdn.net/code_crash/article/details/4854965    
http://www.cnblogs.com/stoneJin/archive/2011/09/21/2184211.html
发表于 2016-05-04 16:25:03 回复(7)
主要就是要弄清楚s,k,p是什么意思。s是一个二维数组,但也可以看成是一个包含3个元素的一维数组,每个元素又是一个包含10个元素的一维数组。s这个名字本身的值是指向它第一个元素的指针。也就是说,s的值是指向包含3个元素的一维数组的第一个元素的指针。即第一个包含10个元素的一维数组的指针。k是一个指针,而不是指针数组。k指向一个包含3个元素的一维数组的指针。
简单说,s是指向一维数组的常量指针,数组包含10个元素。k是指向一维数组的变量指针,数组包含3个元素。而p是指向单个变量的指针。如果一个变量算一个单位长,那么s+1就意味着指针走了10个单位长,k+1就意味着走了3个单位长,p+1就意味着走了1个单位长。
指针不仅仅是地址,它还包括它所指向的类型,这样才能知道下一步它自己要走多长。
发表于 2015-10-27 13:03:28 回复(11)
这道题主要就考指针类型是否一样。
char s[3][10]    s 是数组指针,类型为char (*)[3],所指向的每个数组长度为10;
char (*k)[3]    很明显k就是一个数组指针,类型也为 char (*)[3],但是所指向的每个数组的长度未知;
char *p    类型为char * 指针。
因此,在没有强制类型转换的情况下,只有类型完全相同的指针才能相互复制。
答案:1,2,4
—— —— —— ——3为什么正确?—— —— ——
s[0] 是指向第一行数组的首元素的地址,即s[0] == &s[0][0],指针类型为char *,因此可以与char * p进行复制操作。
发表于 2016-08-07 14:43:15 回复(3)
主要就是要弄清楚s,k,p是什么意思。s是一个二维数组,但也可以看成是一个包含3个元素的一维数组,每个元素又是一个包含10个元素的一维数组。s这个名字本身的值是指向它第一个元素的指针。也就是说,s的值是指向包含3个元素的一维数组的第一个元素的指针。即第一个包含10个元素的一维数组的指针。k是一个指针,而不是指针数组。k指向一个包含3个元素的一维数组的指针。
简单说,s是指向一维数组的常量指针,数组包含10个元素。k是指向一维数组的变量指针,数组包含3个元素。而p是指向单个变量的指针。如果一个变量算一个单位长,那么s+1就意味着指针走了10个单位长,k+1就意味着走了3个单位长,p+1就意味着走了1个单位长。
指针不仅仅是地址,它还包括它所指向的类型,这样才能知道下一步它自己要走多长。
发表于 2016-07-25 09:22:14 回复(0)
啥头像
A。
s  指向数组的指针, 数组元素是一维数组
k 指向数组的指针, 数组元素是char
p 指向char的指针
s[0] 一维数组,很大程度相当于指向char的指针
发表于 2016-03-02 09:30:05 回复(0)
A
1,2,4等号两端指针所指的内容明显不一样,3中s[0]表示s[0][0]的地址,所以可以赋值给p.
发表于 2015-10-28 16:02:47 回复(0)
p 是指向 char 的指针
k 是指向 char数组的指针,数组大小为3
s 是指向 char数组的指针,数组大小为10

k=s 错误是因为,k和s指向的数组大小不同。
k+1 地址移动3个 char的大小
s+1 地址移动10 个char的大小

如果将s 的定义改成 char s[3][3],那么 k=s 就正确了
或者将k 的定义改成 char (*k)[10],那么 k=s 也正确
发表于 2018-07-10 22:25:19 回复(0)
s是字符类型的二维数组、k是指向字符类型数组的指针(是数组指针)、p是字符类型的指针。

A)选项将二维数组赋值给了一个指针;
B)选项将指向一维数组的指针赋值给了一个指针
D)选项将二维数组赋值给了指向一维数组的指针。
故答案为C)。
也可这样分析:
p=s;   s+1一次移动的是10个字节,p+1一次移动1个字节
p=k;  与上同理。 
k=s   k+1一次移动3个字节 ,s+1个字节
发表于 2018-05-23 09:26:43 回复(0)
s是指向数组的指针,*s={s[0][1],s[0][2],...}
s[0]是指向char类型数据的指针,*(s[0])=s[0][1]
k是指向数组的指针,*k={....}
p是指向char类型数据的指针,
因此,p=s,p=k都是错误的,只有p=s[0]是对的;
k和s虽然都是指向数组的指针,但是其所指对象的长度不同,因此k=s是不对的(也就是说k所指向的内存空间不能用于s所指向的内存空间)
发表于 2016-09-17 17:14:50 回复(0)
1.s:行指针,指向有十个元素的数组。 2.k:指向三个元素数组的行指针 3.p:指针
发表于 2022-04-21 17:00:55 回复(0)
指针变量自身的类型,指针变量指向的类型。
指针自身类型,将指针变量名去掉,剩下即为指针自身类型。
指针变量指向的类型,将指针变量名和离它最近的一个*去掉,即为指针指向的类型。
eg: char *p     p指针变量的类型   char *       p指针变量指向的类型   char 
       int **p     p指针变量的类型   char **       p指针变量指向的类型   char *
指针变量指向类型取值宽度和单位跨度。
eg:   char *p     p指针指向类型为   char         取值宽度为 1字节   单位跨度 为1字节
       int *p     p指针指向类型为  int         取值宽度为 4字节   单位跨度 为4字节
在赋值的时候取值宽度和单位跨度要求一致,不一致使用强转。
指针不仅要看指针类型,还要看指针指向每+1移动的字节。
发表于 2023-11-01 19:33:57 回复(0)
(*k)[3] (*s)[10]类比于s[][10]
发表于 2018-09-05 10:45:17 回复(0)
数组名虽然是指针,但应该看成是指针常量,不能修改,因此4是错误的。
发表于 2018-05-02 19:12:26 回复(0)
说一下第3个
p = s[0] 与 p = s[0][0]  等价
发表于 2016-09-23 17:01:25 回复(0)
C
发表于 2015-11-27 00:01:23 回复(4)
wtm你们猜我怎么错的我说1.p这是什么东西,直接选1234
发表于 2023-10-07 19:34:36 回复(0)
为什么s是10个元素
发表于 2023-03-21 15:55:11 回复(0)
int s[3][10]是二维数组 等价于 三个大小为10的一维数组
int (*k)[3]是一个数组指针  理解性看成(*k) int [3]  等价于一个指向大小为3的一维数组的指针
int *p是一个指针
编辑于 2022-11-25 17:53:56 回复(0)
s是一个二维数组名, 可以被看作指针常量, 即 s = &s[0]
k 是一个指针,指向一个列数为3的二维数组
p是一个字符指针,指向一个字符
 赋值语句1和2,等号两边的值的类型不同,所以错误
发表于 2022-08-13 12:06:24 回复(0)
实践是检验瞎猜的标准

发表于 2022-08-01 15:49:35 回复(0)