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