有一个小程序
#include <stdio.h>
#define M(x,y,z) x*y+z
main()
{
int a=1, b=2, c=3;
printf("%d\n",M(a+b,b+c,c+a));
}
计算结果不是19,而是12,为什么呢,是因为它不是把数值计算好了再带入,而是直接带入a + b*b + c + c + a。
#include<stdio.h>
void main(void)
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
输出结果2, 5,为什么呢,因为&a取的是整个数组a的地址,当&a+1;的时候直接跳的数组a的下一个地址,而不是a[1];而后面的ptr - 1;则取到了a的最后一个元素的地址,可以通过下面一个小程序来理解
#include <stdio.h>
void main(void)
{
int a[5]={1,2,3,4,5};
int *p1 =(int *)(&a + 1);
int *p2,*p3;
p2 =(a+5);
p3 =(a-1);
printf("p1: %d,p2: %d\n",p1,p2);
printf("%d,%d,%d\n",*(p1-1),*(p2-1),*(p3+1));
}
还有一个小程序关于传参时的一个小问题。
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
void getmemory(char*p) {
p=(char *) malloc(100);
strcpy(p,"hello world");
}
int main( )
{
char *str=NULL;
getmemory(str);
printf("%s\n",str);
free(str);
return 0;
}
打印结果为null而不是我们想要的hello world,原因很简单,就像我们不能交换传入两个数字的值一样,因为它是void型函数,我们只是在函数内给str赋值了,但是当我们回到主函数,str的数值是不会变的,如果想改变有两种方法,一种就是用双指针去改变,另一种就是通过赋值将void改为char*然后传回主函数即可。
定义**a[3][4],则变量占用内存空间为(B)。
A.4
B.48
C.192
D.12
首先a[3][4]是一个二维数组,**int是数据类型,这样解释就很清楚了,用数据的多少乘以数据的大小就可以了,4*3*4=48。