老师的牛B其实要站在与他同等的条件下才能观察得到, 老师是个很好的引导,不要盲目相信,理科生要动手去了解答案,问问题他可能从他的专业或者他所理解的角度然后给你答案,而如今都是交叉学科,有次在问到有符号数的移位 他说会出现异常,但我用80x86,VC测试却发现是扩展符号位移位
后来在 c专家编程 中看到
typedef struct data{
int data_1;
}data;
中间为data也能过吗,答案是不一定的,视什么编译器
_tag : 标签 如果有可能搞不清哪个名字是结构标签,就为他取一个以“_tag”结尾的名字。使得更容易辨认,
我们在用strcmp(,)时候当相等的时候返回0 而我们希望它只返回真假,这时可以用来
#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)
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下通过检测