首页 > 试题广场 >

以下程序段执行后结果是

[单选题]
以下程序段执行后结果是()
#include<stdio.h>
int main(){
    short *p,*q;
    short arr[15] = {0};
    p = q = arr;
    p++;
    printf("%d,", p - q);
    printf("%d,", (char*)p - (char*)q);
    printf("%d", sizeof(arr) / sizeof(*arr));
}
  • 1,0,15
  • 0,2,1
  • 1,1,15
  • 1,2,15
D
指针自增、自减每次移动的偏移量是指针所指向对象的字节大小,所以p++与q的偏移量是2个字节。
指针相减的值是指针地址的偏移除以指针每次移位的大小;
1)p-q=1;偏移量为2个字节,每次移动2个字节,所以为1
2)(char *)p-(char *)q,指针的偏移没变,但是每次指针移位是按照(char*)类型移动,即每次移动1个字节,所以是2
3)数字每次元素2个字节,所以sizeof(arr)为30,sizeof(*arr)为2。
发表于 2015-10-15 10:16:05 回复(9)
整体求解思路是:p q是指向地址的指针,随着数据类型的不同而产生的偏移量不同;
short类型大小是2字节,char类型大小是1字节;
++p是地址偏移量为2字节,但是对于short类型来说就是相差1,转化为char类型就是2;
sizeof是指数组的所占内存的大小=数据类型*个数;
发表于 2016-03-10 21:57:14 回复(3)

两个指针变量之间的运算

只有指向同一数组的两个指针变量之间才能进行运算,否则运算毫无意义。

1) 两指针变量相减

两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。 实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。例如pf1和pf2是指向同一浮点数组的两个指针变量,设pf1的值为2010H,pf2的值为2000H,而浮点数组每个元素占4个字节,所以pf1-pf2的结果为(2000H-2010H)/4=4,表示pf1和 pf2之间相差4个元素。
注意:两个指针变量不能进行加法运算。例如,pf1+pf2是什么意思呢?毫无实际意义。

2) 两指针变量进行关系运算

指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的关系。例如:
  • pf1==pf2 表示pf1和pf2指向同一数组元素;
  • pf1>pf2 表示pf1处于高地址位置;
  • pf1<pf2 表示pf2处于低地址位置。

指针变量还可以与0比较。设p为指针变量,则p==0表明p是空指针,它不指向任何变量;p!=0表示p不是空指针。

空指针是由对指针变量赋予0值而得到的。例如:
#define NULL 0
int *p = NULL;
对指针变量赋0值和不赋值是不同的。 指针变量未赋值时,值是随机的,是垃圾值,不能使用的,否则将造成意外错误。而指针变量赋0值后,则可以使用,只是它不指向具体的变量而已。
以上从 http://c.biancheng.net/cpp/html/75.html摘选
发表于 2016-03-13 10:11:01 回复(1)
      (1) 指针相减的值是指针地址的偏移除以指针每次移位的大小,指针p和指针q都为short类型,偏移为2个字节,每次移动两个字节,所以p-q=2/2=1;
      (2)  (char*)p及 (char*)q是将p和q转化为char类型的指针,每次移动一个字节,但是p和q原本是short类型,偏移量为2个字节,所以 (char*)p- (char*)q=2/1=2;
      (3) sizeof(*arr)表示的是arr数组的第一个字符所占的大小为2个字节,sizeof(arr)表示数组所有元素的字节个数为15*2=30个字节。两者相除代表数组元素个数。
       
发表于 2017-05-13 19:59:00 回复(1)
四个答案第一个都是1,故而第一个输出为“1”;选项中第二个输出,可选项有“0”,“1”和“2”,而“2”独占其2,可见出题者对2的偏爱,故而第二个输出为2;同理,第三个输出自然就是15,这样的题目,我只想说,出题者是个傻叉~~~
发表于 2015-10-19 16:25:22 回复(2)
第一个打印的是两个指针之间元素的个数(指针之间的减法就是这样)
第二个是*p-*q为一个char的大小占2个字节
第三个sizeof(*arr)表示的是arr数组的第一个字符占1个字节,第一个sizeof()是数组的长度为15

发表于 2016-03-12 15:05:04 回复(2)
答案为D,原因如下:p与q都是short类型,地址相差1;当其转为char*类型的时候,距离变为2;第三个printf输出的其实是数据arr的元素个数,15.

发表于 2015-10-14 19:54:20 回复(2)
这里讲的很清楚:
http://c.biancheng.net/cpp/html/75.html
发表于 2016-01-15 21:58:35 回复(0)
结合@大菜鸟大菜狗 的解析:
指针相减 = 指针地址偏移量(以字节为单位)/ sizeof(该指针所指向对象的类型);
(1) p-q = (2 / sizeof(short)) = 2/2 = 1;
(2)(char *)p - (char *)q = (2 / sizeof(char)) = 2/1 = 2;
发表于 2016-03-15 22:08:42 回复(0)
    printf("%d,",(char*)p-(char*)q);没懂求解答
发表于 2015-10-15 19:58:16 回复(3)
指向同一数组的指针可以做差,差值为所指针之间的元素个数,所以第一个输出1;第二个正常来说也是1,但是他们做了char转换,2/1=2,所以输出2;第三个,数组空间大小除以数组中第一个元素所占空间大小,则可得15。
编辑于 2022-03-19 11:48:39 回复(0)
两指针相减代表的是两指针间相差的元素个数,指针的自增运算的偏移量随指针指向元素的不同而不同
发表于 2018-06-14 09:51:46 回复(0)
#include<stdio.h> void main() {     short *p,*q;     short arr[15]={0};     p=q=arr;     p++;     printf("%p\n",p);     printf("%p\n",q);     printf("%d,",p-q);     printf("%d,",(char*)p-(char*)q);     printf("%d",sizeof(arr)/sizeof(*arr)); }
结果:
0x7ffd83c53272
0x7ffd83c53270
1,2,15
这个题最然我在意的结果就是p-q为什么是1,从地址上看确实应该是2。
但是我觉得想当然了,p-q的值取决于p-q的类型。那么如果类型不匹配呢?
编译就会报错,所以确实的p和q的存储地址差了两位,但是两个相减的差值,取决于该指针的类型。
发表于 2018-06-12 09:02:56 回复(0)
#include<iostream>

using namespace std;

int main()
{
    short *p, *q;
    short arr[15] = { 0 };
    p = q = arr;
    p++;
    cout << p << " " << q << " " << p - q << endl;
    cout << (char*)p << " " << (char*)q << " " << (char*)p - (char*)q<< endl;
    cout << sizeof(arr) << " " << sizeof(*arr) << " " << sizeof(arr) / sizeof(*arr) << endl;
}  

两指针变量相减

两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。  实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。 例如pf1和pf2是指向同一浮点数组的两个指针变量,设pf1的值为2010H,pf2的值为2000H,而浮点数组每个元素占4个字节, 所以pf1-pf2的结果为(2000H-2010H)/4=4,表示pf1和 pf2之间相差4个元素。 这样就可以解释为什么是答案分别是1 2了

发表于 2018-05-16 17:41:03 回复(0)
指针自增、自减每次移动的偏移量是指针所指向对象的字节大小,所以p++与q的偏移量是2个字节。 指针相减的值是指针地址的偏移除以指针每次移位的大小; 1)p-q=1;偏移量为2个字节,每次移动2个字节,所以为1 2)(char *)p-(char *)q,指针的偏移没变,但是每次指针移位是按照(char*)类型移动,即每次移动1个字节,所以是2
发表于 2017-03-14 00:08:18 回复(0)
这是一个 C 语言程序,它声明了两个 short 类型的指针变量 p 和 q,并初始化了一个长度为 15 的 short 类型数组 arr,用于存储多个 short 类型变量。然后将 p 和 q 指向数组的第一个元素。

接着,将 p 的值加 1,此时 p 所指的内存地址是数组的第二个元素。输出 `p - q` 的值,即两个指针之间的元素数目,这里为 1。因为 p 和 q 本来就指向相邻的数组元素,而 p 加 1 后指向了下一个元素,所以两个指针之间只隔了 1 个元素。

然后输出 `(char*)p - (char*)q` 的值,也就是把指针转换成 char 类型后再做减法的结果。由于 char 类型大小为 1 字节,short 类型大小为 2 字节,所以实际上这个值等同于 `(p - q) * sizeof(short)`。因为已经计算出 `p-q=1`,所以 `(char*)p - (char*)q` 的值是 2。

最后输出数组 arr 中 short 类型变量的个数,即 `sizeof(arr) / sizeof(*arr)` 的值,这里为 15。

编辑于 2023-04-03 12:51:00 回复(1)
#include<iostream> using namespace std; int main() {     short *p, *q;     short arr[15] = { 0 };     p = q = arr;     p++;     cout << p << " " << q << " " << p - q << endl;     cout << (char*)p << " " << (char*)q << " " << (char*)p - (char*)q<< endl;     cout << sizeof(arr) << " " << sizeof(*arr) << " " << sizeof(arr) / sizeof(*arr) << endl; } 两指针变量相减 两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。 例如pf1和pf2是指向同一浮点数组的两个指针变量,设pf1的值为2010H,pf2的值为2000H,而浮点数组每个元素占4个字节, 所以pf1-pf2的结果为(2000H-2010H)/4=4,表示pf1和 pf2之间相差4个元素。 这样就可以解释为什么是答案分别是1 2了</iostream>
发表于 2022-12-18 21:00:58 回复(0)

两个指针变量之间的运算

只有指向同一数组的两个指针变量之间才能进行运算,否则运算毫无意义。

1) 两指针变量相减

两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。 实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。例如pf1和pf2是指向同一浮点数组的两个指针变量,设pf1的值为2010H,pf2的值为2000H,而浮点数组每个元素占4个字节,所以pf1-pf2的结果为(2000H-2010H)/4=4,表示pf1和 pf2之间相差4个元素。
注意:两个指针变量不能进行加法运算。例如,pf1+pf2是什么意思呢?毫无实际意义。

2) 两指针变量进行关系运算

指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的关系。例如:
  • pf1==pf2 表示pf1和pf2指向同一数组元素;
  • pf1>pf2 表示pf1处于高地址位置;
  • pf1<pf2 表示pf2处于低地址位置。

指针变量还可以与0比较。设p为指针变量,则p==0表明p是空指针,它不指向任何变量;p!=0表示p不是空指针。

空指针是由对指针变量赋予0值而得到的。例如:
#define NULL 0
int *p = NULL;
对指针变量赋0值和不赋值是不同的。 指针变量未赋值时,值是随机的,是垃圾值,不能使用的,否则将造成意外错误。而指针变量赋0值后,则可以使用,只是它不指向具体的变量而已。
发表于 2022-06-05 16:16:42 回复(0)

p是short类型,p++增加两个字节的大小
(char )p将p强制转换成char指针,char占有一个字节,因此
(char
)p - (char *)q =2

发表于 2017-07-18 23:22:52 回复(0)
如上图,只对题目中的输出做了一点更改。可以看到,p,q (char *)p,(char *)q 的地址是一样的,区别是 p-q=1;偏移量为2个字节,每次移动2个字节,所以为1, (char *)p-(char *)q,指针的偏移没变,但是每次指针移位是按照(char*)类型移动,即每次移动1个字节,所以是2; 数字每次元素2个字节,所以sizeof(arr)为30,sizeof(*arr)为2。(灰色的字是复制别的牛友的~)
发表于 2017-05-21 20:38:35 回复(0)