c 语言的一些知识

来源:互联网 发布:京东怎么做淘宝客 编辑:程序博客网 时间:2024/04/30 09:44


    1.在数组中比如int a[5],注意 a+1 和 &a + 1的不同之处,虽然a和&a的大小相同,但索表示的意义不同,也就是他们的基类型字节数不同, a+ 1所表示的a[1]这个值,但&a+1所表示的是a[5](溢出),&a是a数组存储区的首地址,当&a +1时,相当于加了一个int[5]类型大小的空间,int *p =(int *) (&a+1), 打印 p-1得到的是a[4]的值,c语言是一个强类型的语言,因为p是一个指向 int 型的指,所以p-1就、会减4个字节,也就是一个int空间大小,使的p从a[5]地址处,降到a[4]处。

   2. 比如int a = 3; 打印&a["welcome!"]会显示,"come",因为,数组元素中的[ ]是变址运算符,相当于*( + ),a["welcome"]相当于*( 3+"welcome" ),而"welcome"是一个字符串,它加3就像当于取它的第4个字符‘c',而取地址&是为了打印'l'后的字符串。

  3. double a[2], *p, *q;  p = a; q = p+1; 这里的加1是加的一个double类型的字节的空间,p,q能访问一个double类型空间大小的数,因此p和p+1会相差8字节(不同编译器会有不同),而int *a 和 a +1会相差4字节等等;而(int)q - (int)p 是多大?是double型字节数,因为数组是连续的空间,(int)q - (int)p就是将q,p的地址 值 转成int型相减,大小就是double型字节数;而(int *)q - (int *)p又会是多少?是2,(这里按double 8字节,int 4字节算的),这是为什么呢?这样来看,double *p 能访问的是一个8字节的数,而int *p能访问的是一个4字节的数,而将double *p强制转换成int * ,那编译器会把原来的8字节访问空间分成2个4字节空间,所以(int *)q - (int *)p等于2;

    4.sizeof 运算符一般是不会对所要查询的表达式进行计算。比如 int i = 3; sizeof(i++), printf("%d\n",i); 显示的不是4而还是3, sizeof()还能根据表达式的类型或函数的返回类型进行进行查询。比如int a = 3; double b = 3; sizeof(a+b),显示的是8 ; char f() ,这是一个返回值为char的函数。sizeof(f())显示的是1. sizeof 是可以不加括号的,
但在这种情况下必须加(), 即sizeof(int);  sizeof int .这样写是错的。

    5. 一般情况下 int 是4个字节,现在假设有这样一个int 型的ox112a3e4f整数,它占满的4个字节。现在要将这个
整数的高低字节中的数进行交换,最后得到的是ox4f3e2a11;这里的要点就是怎样获取这4个字节中的数?其实可以个这样定义:        union A{ int i ; char b[4];}a; 然后对i赋值,用b数组来获取个字节中的数。。。。。

    6. 如果有这样的一个数组 int a[3][3] 和一个int (*p)[2] ; 使 p = a;  然后判断 &a[1][1] - &p[1][1] 是否等于0?  答案当然是否定的:因为,首先。可将数组看成是一个线性表,则:


a[0]                                                                                  a[1]                       a[1][1]                                                a[2]










p[0]                                                     p[1]                        p[1][1]                p[2]                                                        p[3]                                                    p[4]

        从图中可以看出 &a[1][1] - &p[1][1] 等于1,而不等于0;

    7. 如果有这样的一个循环,char ch; for(ch = -3; ch < sizeof(int); ch++){printf("welcome here!\n");}, 猜测会打印几次字符串? 
        其实一次也不会打印,因为sizeof(int)所返回的是一个无符号的长整型,而ch 是一个有符号的字符型,当一个带符号的字符型于一个整型进行操作时,编译器会将低类型转成高类型,在这里,会将字符型的-3转成无符号长整型,进而-3会变的很大,所以不会进入循环。


阅读(51) | 评论(0) | 转发(0) |
0

上一篇:java 中读取文件最后一行信息

下一篇:html中meta标签的使用

相关热门文章
  • test123
  • 编写安全代码——小心有符号数...
  • 使用openssl api进行加密解密...
  • 一段自己打印自己的c程序...
  • sql relay的c++接口
  • 那一台服务器也没5T的存储空间...
  • 公司有5T的数据用于下载,数据...
  • CACTI监控ESXI中的虚拟机,监...
  • 如何挂载一块以前做过LVM的硬...
  • 做主主同步,只同步个别的几张...
给主人留下些什么吧!~~