您的位置:首页 > 其它

关于一些小问题

2016-04-12 13:28 162 查看
有一个小程序

#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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: