一些程序段分析(1)

       最近刷了不少牛客上的题目,感觉无论对于基础知识还是编程能力都有一点点地提升。对其中出现频率比较高的程序段分析题作一个简要的总结,以方便以后查看。

程序段1:

char a[] = "xyz", b[] = {'x', 'y', 'z'};
if (strlen(a) > strlen(b))
	printf("a > b\n");
else
	printf("a <= b\n");
分析:strlen函数是从第一个元素开始到遇到第一个'\0'为止字符的个数。因而strlen(a)==3,由于b中结束符'\0'位置未知,因而strlen(b)>=3,故a<=b。

程序段2:

int main(int argc,char**argv)
{
	int a[4] = {1,2,3,4};
	int *ptr = (int*)(&a+1);
	printf("%d",*(ptr-1));
}
分析:指针的实质为:地址+步长。指针的类型决定了步长。定义了数组a[4],其中a,&a,&a[0]都是数组的起始地址。但是步长有区别,也就是指向的类型不同。a等同于a+0等同于&a[0],是指向数组第一个元素的指针,步长为指向的元素所占用的地址空间为sizeof(int) 。&a也是指向数组第一个元素的指针,但其意义是指向整个数组的首地址,指向的类型为整个数组,所以&a+1相当于a+sizeof(a),指向了4的下一地址。因此,ptr-1指向了元素4。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值