作者在 2011-03-20 22:58:59 发布以下内容
声明相当与普通的声明:所说明的并非自身,而是描述其他地方创建的对象。
定义相当于特殊的声明:它为对象分配内存。
定义指针时,编译器并不为指针所指的对象分配空间,只是分配指针本身的空间,除非在定义的同时赋值给指针一个字符串常量,进行初始化,并只有对字符串常量才能如此,并且初始化指针时所创建的字符串被定义为只读,无法修改这个字符串的值。
数组:声明:extern:如extern char a[]:不可以改写成指针的形式。
数组:声明:定义:如char a[10]:不可以改写成指针形式
数组:函数参数:如fun(char a[]):可选择数组或者指针的形式
数组:在表达式中使用:如c = a[i]:可根据自己喜欢,选择数组或者指针形式。
但数组和指针在编译器处理时是不同的,运行时的表达形式也不一样,并可能产生不同的代码,对编译器而言,一个数组就是一个地址,一个指针就是一个地址的地址。
作为函数定义的形式参数,数组的下表表达式总是可以改写成带偏移量的指针表达式。
何时指针和数组相同:
1.表达式中的数组名(与声明不同)被编译器当作一个指向该数组的第一个元素的指针。
2.下标总是与指针的偏移量相同。
3.在函数参数的声明中,数组名被编译器当作指向该数组的第一个元素的指针。
把作为形参的数组和指针等同起来是处于效率原因的考虑。
C语言中,所有的非数组形式的数据实参均以传值形式调用,对实参做一份拷贝并传递给调用的函数,函数不能修改作为实参的实际变量的值,只能修改传递给它的那份拷贝。函数返回值绝不能是一个函数数组,它只能是指向数组或者函数的指针。
所有属于函数实参的数组在编译时被编译器改写成指针,因此,在函数内部对数组参数的任何引用都将产生一个对指针的引用。
数组名是不可修改的左值,它的值不可改变。
数组和指针可交换性总结:
1.用a[i]对数组进行访问总是被编译器改写成或者解释为*(a+i)这样的指针访问。
2.指针始终就是指针,绝不可能改写成数组。可以用下标形式访问指针,一般都是指针作为函数参数时而且你知道实际传递给函数的是一个数组。
3.作为函数参数时,一个数组的声明可以看作是一个指针,作为函数参数的数组始终被编译器改成指向数组第一个元素的指针。
4.当把一个数组定义为函数参数时,可以选择将他定义为数组,也可以定义为指针。无论哪种方法,在函数内部事实上获得的都是一个指针。
5.在其他所有情况中,定义和声明必须匹配,如果定义了一个数组,在其他文件对他进行声明时也必须声明为数组,指针也是如此。
不能把数组赋值给另一个数组,因为数组作为一个整体不能作为赋值的对象。可以把数组名赋值给一个指针。
char a[4][6]的定义表示a是一个包含4个元素的数组,每个元素是一个char类型的指针。
数组名被改写成一个指针参数不是递归的,数组的数组会被改写成“数组的指针”而不是“指针的指针”。
实参 所匹配的形式参数
数组的数组 char c[8][10]; char (*)[10]; 数组的指针
指针数组 char * c[15]; char**c; 指针的指针
数组指针 char (*c)[64]; 不改变
指针的指针 char **c ; 不改变
使用指针向函数传递一个多维数组:
1.一维数组:没有问题,但需要包括一个计算数值或者一个能标识越界位置的结束符。
2.二维数组:不能直接传递函数,但是可以将矩阵改写成一个一维Iliffle向量。并使用相同的下标表示方法,对字符串可以这么做,对其他的类型需要增加一个记数值或者标识越界位置的结束符。同样他依赖于调用函数和被调用函数之间的约定。
3.多维数组:都无法使用,必须分解成几个更少的数组。
不能从函数中返回一个指向函数局部变量的指针。
库函数realloc()能够对一个现在的内存块大小进行重新分配,通常是使之扩大,同时不丢失原先的内存块内容,当需要在动态链表中增长一个项目时,可以进行如下操作:
1.对表进行检查,看是否真的已经满了。
2.若确实已满使用realloc()扩展表的长度,并进行检查,确保realloc()操作成功进行。
3.在表中增加所需要的项目。
用代码表示大致如下:
int current_element = 0;
int total_element = 128;
char * dynamic = malloc(total_elememt);
void add_element(char c)
{
if (current_element == total_element - 1)
{
total_element * = 2;
dynamic = (char *)realloc(dynamic,total_element);
if(dynamic == NULL)
error ("Couldn't expand the table");
}
current_element ++;
dynamic[current_element] = c;
}
int total_element = 128;
char * dynamic = malloc(total_elememt);
void add_element(char c)
{
if (current_element == total_element - 1)
{
total_element * = 2;
dynamic = (char *)realloc(dynamic,total_element);
if(dynamic == NULL)
error ("Couldn't expand the table");
}
current_element ++;
dynamic[current_element] = c;
}