关于一些小问题

有一个小程序

#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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值