C语言指针、字符串、取反问题

来源:百度知道 编辑:UC知道 时间:2024/06/03 17:09:48
因为要考二级了,所以有很多问题,先提出以下有五个问题:
1.指针问题:
若有下列定义:int a[]={1,2,3,4,5,6,7,8,9,10},*p=a;,则值为3的表达式为:_______
答案是:p+=2,*(p++)
解释如下:
由题可知a[2]=3,因此只要使指针p指向a[3],然后再引用指针的值即可。
我的疑问:
*p=a的意思是p指向a的首地址即a[0],然后我填的答案是"*(p+2)",这样p+2=3,即指向a[2]的地址,想问问为什么不可以。还有解释里为什么要让p指向a[3]?这个让我很费解,应该是指向a[2]才对啊

2.字符串问题
以下程序的输出结果是:______
main()
{char a[7]="a0\0a0\ 0";int i,j;
i=sizeof(a);
j=strlen(a);
printf("%d %d\n",i,j);
}
答案:7 2
我的疑问:
sizeof返还的是数组所占内存的值,因为定义的是a[7],所以i=7,但是strlen我就不大明白了,像“\n、\0、\t、\r”这些转义字符在字符串里占长度么?这个题里“a0\0a0\ 0”有单独的0,还有“\空格0”,0不占长度么?"\0"中间有空格没有关系么?

3.字符问题
我看书上说'hello'这种是不合法的,因为只占一个字符,所以里面只能有一个字母,那如果换成数字呢?或者换成转义字符\n什么的可以么?

4.取反的问题
若x=10010111,则表达式(3+(int)(x))&(~3)的运算结果是:
答案是10011000
我的疑问:
我记得二进制的第一位是用来表示正负的,为什么这道题却没有考虑?如果考虑正负的话,那么答案就不是这个了,这道题(3+(int)(x)),按正负算是-20,不考虑

1、第一题的答案纯属误导,坚持你的意见就行

2、char a[7]="a0\0a0\0";
这个你要注意,strlen碰到'\0'后就会以为串已经结束,并返回,所以碰到第一个\0时就返回长度2了
至于那个空格,应该没有吧,我在vc里面直接就编译不过去

3、只要你单引号里面能表示为一个字符就行,而数字,看起来是数字,其实是字符,所以'123'这种不允许,不过这种'\55',表示转义可以

4、如果程序里面有“无符号”,“有符号”这类字眼,是要考虑的,否则一般不用

5、什么完整形式,没听说过,0xff,前面的0x只是为了说明是一个16进制的数而已,这么说吧,二进制的4位表示16进制的1位,比如0001 0001表示0x11,4位4位的转化,而8进制则用3位二进制表示,如001 001 表示 八进制的11

1.
p+=2,*(p++); *(p+2);都是对的。明确告诉你指向a[2]不是a[3].
要相信自己啊。

2.
sizeof()函数是用来计算所占字节数的;strlen()是用来计算数组a的字符长度的。二者概念不同,不要混淆。‘/0’空字符

3.
换成数字还是一样的,一个数字可以看成是一个字符。
里面还可以是转义字符‘/0’的写法也对。

4.看不懂你问的什么意思。

5.

正确。
16进制是0x开头的,8进制是0开头的;

1
由题可知a[2]=3,因此只要使指针p指向a[3],
这一看就是印错了么
因为a2=3 所以指a3 这还用问么
2
a0\0 长度到此为止 strlen遇到\0认为字符串结束了

3
可以 但要加转义字符\ 否则就直截用常数 没有引号

4
人家没说符号的问题 要的答案也是2进制