C专家编程--读书笔记四 数组和指针并不相同

第四章
 
一、知识点
1、C语言中的对象必须有且只有一个定义,但它可以有多个extern声明。定义是一种特殊的声明,它只能出现在一个地方,确定对象的类型并分配内存,用于创建新的对象;而声明可以多次出现,描述对象的类型,用于指代其他地方定义的对象(例如在其他文件里)例:extern int my_array[]; 
extern对象告诉编译器对象的类型和名字,对象的内存分配则在别处进行。由于并未在声明中为数组分配内存,所以不需要提供关于数组长度的信息。对于多位数组,需要提供除最左边一维之外其他维的长度。(P88)
 
2、编译器为每个变量分配一个地址(左值)。这个地址在编译时可知,而且该变量在运行时一直保存于这个地址。相反,存储于变量中的值(它的右值)只有在运行时才可知。如果需要用到变量中存储的值,编译器就发出指令从指定地址读入变量值并将它存入寄存器中。(P89)
 
3、对于数组,如果编译器需要一个地址来执行某种操作,它就可以直接进行操作,并不需要增加指令首先取得具体的地址。相反,对于指针,必须首先在运行时取得它的当前值,然后才能对它进行解除引用操作。(P89)
 
4、指针和数组是不一样的,比如:(P87)
文件1:
int mango[100];
 
文件2:
extern int *mango;
在文件1中定义了数组mango,但文件2声明它为指针,这是错误的。
 
5、对于指针定义 (P92)
int *raisin;
则申请一个地址荣楠该指针。指针变量raisin本身始终位于同一个地址,但它的内容在任何时候都可以不相同,指向不同地址的int变量。
定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义时同时赋给指针一个字符串常量斤进行初始化。但是定义时如果赋给指针一个浮点数之类的常量则无法通过编译。不能指望为浮点数之类的常量分配空间。比如:
float *p = 3.123;  //错误,无法通过编译
只能写作: float *p;
                 *p = 3.23; 
 
二、问题
1、为什么定义指针时初始化不能为浮点数之类的常量分配空间?
2、编写一个C程序,产生1万个单词的回文。
posted on 2012-04-30 23:11  谷堆旁边  阅读(282)  评论(0编辑  收藏  举报