Summer 11

本文深入探讨了C语言中的指针、数组、运算符优先级等核心概念,并通过实例讲解了如何利用这些特性进行高效编程,包括字符串长度计算、数组初始化、类型转换等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.程序输出结果是  8

int fun(char *s)//定义一个函数,传入参数为字符串
{
	char *p = s;//定义一个指针指向传入字符串的首地址
	while (*p!='\0')//判断是否字符串结束标志‘\0’
	{
		p++;//如果p指向的地址不为‘\0’的话,p指针后移一位char,直到为\0结束
	}
	return(p - s);//返回字符串结尾到字符串开头的字母数目,也就是传入字符串的长度
}

int main()
{
	printf("%d\n", fun("goodbye!"));
	system("pause");
	return 0;
}

2.下列关于数组与指针的区别描述正确的是  B

A. 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建

B.用运算符 sizeof 可以计算出数组的容量(字节数)

C. 指针可以随时指向任意类型的内存块

D. 用运算符sizeof 可以计算出指针所指向内容的容量

A.堆上创建动态数组

B.sizeof(数组名)就是数组的容量

C.const指针不可以

D. char* str = "hello"; sizeof(str)不能计算出内容的容量,只是指针的容量。

3.给定如下代码: int arr[4]={0}; int brr[4]={1}; 数组 arr 和 brr 的值为 {0,0,0,0},{1,0,0,0}

聚合类型只初始化一部分,其余部分为0.

4. 数组定义为 int a[4]={0}; 表达式     a++ 是错误的。


a代表数组名或者内存连续区域第一块数据的地址。[]表示基址寻址。

加*表示对数组起始位置按照数组元素数据类型寻址取值第一个元素。加&表示取第一个元素地址。a与&a与&a[0]相同。a为常量,可以运算,不可赋值。数组中a指的是数组首地址,地址是常量,常量是不可以自加的,只有变量才可以自加。

5.如下代码运行结果是 250

int main()
{
	unsigned char a = 0xA5;
	unsigned char b = ~a>>4+1;
	printf("%d\n", b);//250
	system("pause");
	return 0;
}

这道题考查两个知识点:一是类型转换问题;而是运算符优秀级问题。

对于第一个问题:unsigned char b=~a>>4+1;编译器会把a和4先转换成int型,再进行计算。然后将计算结果转换成unsigned char 赋值给b。

对于第二个问题:因为“~”的优先级高于>>的优先级,故先对1010 0101取反 01011010,再右移。因为+的优先级高于>>,故先加再位移。于是0101 1010 右移5位结果是00000010.最后的结果应该是2才对,但是把如上的指令放到vs2013中运行,答案居然是250.

那么到底是什么地方出了问题?在调试的过程中进入汇编指令。可以看到高级语句转换为汇编语言以后,是先执行取反再位移的

我们看到eax是16位的寄存器,于是机器中0xA5的寄存中表达是0000 0000 1010 0101 ,取反是1111 1111 0101 1010,

那么右移5位是0000 0111 1111 1010,由于是unsigned char型的只能表示第8位的数组,即250.

6.如下代码输出结果为 1,1

int main()
{
	const int i = 0;
	int *j = (int *)&i;
	*j = 1;
	printf("%d,%d", i, *j);// 1,1
	system("pause");
	return 0;
}

在C语言中,const变量只不过是修饰该变量名,它并不能使内存变为只读。也就是说,我们不能通过变量名再去操作这块内存。但是可以通过其它方法,如指针,通过指针是可以修改被const修饰的那块内存的。

7. 写出中缀表达式: 12+5*(2+6)-1  对应的后缀表达式:12 5 2 6 + *+ 1-

中缀表达式a + b*c + (d * e + f) * g,其转换成后缀表达式则为a b c * + d e * f  + g * +。

1)先按照运算符的优先级对中缀表达式加括号,变成( ( a+(b*c) ) + ( ((d*e)+f) *g ) )

2)将运算符移到括号的后面,变成((a(bc)*)+(((de)*f)+g)*)+

3)去掉括号,得到abc*+de*f+g*+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值