关于一些小问题
2016-04-12 13:28
162 查看
有一个小程序
计算结果不是19,而是12,为什么呢,是因为它不是把数值计算好了再带入,而是直接带入a + b*b + c + c + a。
输出结果2, 5,为什么呢,因为&a取的是整个数组a的地址,当&a+1;的时候直接跳的数组a的下一个地址,而不是a[1];而后面的ptr - 1;则取到了a的最后一个元素的地址,可以通过下面一个小程序来理解
还有一个小程序关于传参时的一个小问题。
打印结果为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。
#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。
相关文章推荐
- .htaccess详解及.htaccess参数说明
- 微博MySQL优化之路--dockone微信群分享
- 文章标题
- database link问题解决
- Android TabLayout与ViewPager实现动态Tab
- 老黄聊架构:微服务架构落地之前,需要想清楚的几个关键问题
- AD域和第三方进行用户对接的注意事项
- HTML 5 简介
- SQL Server简洁分页代码
- cli的使用与Linux环境变量持久化
- 【算法】链表
- TokuDB的特点验证
- SQL 這個子查詢最多只能傳回一個記錄
- C++中经常使用到宏
- 百叶窗式的幻灯片切换效果原理
- TokuDB的特点验证
- TokuDB的特点验证
- [lua]lua简介
- C# SQL查询代码
- 字节,字符 编码