C语言细节

老师的牛B其实要站在与他同等的条件下才能观察得到老师是个很好的引导,不要盲目相信,理科生要动手去了解答案,问问题他可能从他的专业或者他所理解的角度然后给你答案,而如今都是交叉学科,有次在问到有符号数的移位 他说会出现异常,但我用80x86,VC测试却发现是扩展符号位移位

后来在 c专家编程 中看到

typedef struct data{

int data_1;

}data;

中间为data也能过吗,答案是不一定的,视什么编译器

_tag : 标签 如果有可能搞不清哪个名字是结构标签,就为他取一个以“_tag”结尾的名字。使得更容易辨认,

我们在用strcmp(,)时候当相等的时候返回而我们希望它只返回真假,这时可以用来

#define STRCMP(a,R,b) (strcmp(a,b) R 0) 更直观更自然的表示它的意思

趣闻:你知道为什么数组是从0开始的吗?这时因为坐标偏移量在定义者的心中已经根深蒂固。专业的角度定义这些概念

指针与数组的区别 关系:

指针存的是数据的地址,而数组存的是数据,从这种可以分析得来下面的一系列


每个符号的地址在编译时可知。所以,如果编译器需要一个地址来执行某种操作,他就可以直接进行操作,并不需要增加指令首先取得具体的地址。相反,对于指针,不许首先在运行时取得它的当前值,然后才能对它进行解引用操作

取值;指针的访问要灵活的多,但需要增加一次额外的提取,

编译器符号表有一个符号P,它的地址为1000---->取地址1000的内容,,也就是它的值--->取地址。。。的内容

  那么当你“定义为指针,但却以数组的方式引用”会发生什么呢,反过来又会发生什么呢?

         通过上面的解释,我们发现会出现直接引用和间接引用的区别,也就是上面多的一条指令,

   访问值的时候数组会少一步操作,这是区别之一

ANSI C中,初始化指针时创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。在有些编译中,字符串常量时常被存放在只允许读取的文本段中,以防止它被修改。


   这里补上一个问题,测结构体某个成员相对于结构体首地址的偏移量,看看书上是怎么测的,

   

#define offsetof(s,m)      (size_t) & (((s *)0)->m)

s 是结构体的类型,m是其中的成员,利用强制转换 和0地址的巧妙使用,size_t是typedef unsigned int size_t;这些东西是不是你只是看得懂而用不出来呢。
 
 
在编译要求确定数组有确定的空间,以便分配内存,形如这种:
int const m = 3;
int array[m];这样也是行的通的, 但要对array在这里进行初始化却不行,(linux gcc)它比利用宏定义有个优势,就是类型确定 宏则无类型可言 
 
int  temp = 8;
%#x 打印出来则为0x8
 
我们在用字符型接收整形变量 作比较的时候,vc等很多编译器会截取比较,如 c = 0xff; if(c == eof)printf("cat \n");这句会被打印出来的,为什么呢,这就是截取比较

 

#define EOF -1
main()
{
     register int c;
     while((c = getchar()) != EOF)
         putchar(c);
}


这段代码在一些机子上运行会特别慢?这是为什么呢? 深表疑惑??

        将字符串赋值给整形数组,如: int str[20] = {"123456"}; 这句在vc上编译能过,但是gcc过不了的 ,我们观察vc中数组str中存储的是什么呢?我们知道“123456”返回的是一个地址,在整形 str中存储的也是一个地址。即是只有4个字节有赋值,我们在利用这里的赋值 找到存“123456”在内存中的位置。

        指针 ,,,,,,地址

char str[] = {'1' , '2' , '3' , '4' };

这样 str 中只有4个元素 如果我们 {“1234”}这样则其中有5个元素 gcc ,vc下通过检测

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值