数组/指针

来源:互联网 发布:windows dns 缓存 编辑:程序博客网 时间:2024/06/03 18:40

定义是一种特殊的声明,它创建了一个对象:声明简单地说明了在其他地方创建的对象的名字,它允许你使用这个名字。

定义

只能出现在一个地方

确定对象的类型并分配内存,用于创建新的对象。例如:int my_array[100]

声明

可以多次出现

描述对象的类型,用于指代其他地方的定义的对象(例如在其他文件里)例:extern int my_array[];

声明相当于普通的声明:它所说明的并非自身,而是描述其他地方的创建的对象。

定义相当于特殊的声明:它为对象分配内存。


                                

地址(左值)与地址(右值)之间的区别


extern char a[] 与extern char a[100]等价。这两个声明都提示a是一个数组,也就是一个内存地址,数组内的字符可以从这个地址找到。编译器并不需要知道数组总共有多少长,因为它只产生偏离起始地址的偏移地址。

数组与指针的其他区别

指针

数组

保存数据的地址

保存数据

间接访问数据,首先取得指针的内容,把它作为地址,然后从这个地址提取数据。

如果指针有一个下标[I],就吧指针的内容加上I作为地址,从中提取数据

直接访问数据,a[I]知识简单地以a+I为地址取得数据

通常用于动态数据结构

通常用于存储固定数目且数据类型相同的元素

相关的函数为malloc和free

隐式分配和删除

通常指向匿名数据

自身即为数据名

数组和指针都可以在它们的定义中用字符串常量进行初始化。尽管看上去一样,底层的机制却不同。

定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义时同时赋给指针一个字符串常量进行初始化。例如,下面的定义创建了一个字符串常量:

char *p = "breadfruilt";

注意只有对字符串常量才是如此,不能指望为浮点数之类的常量分配空间,如:

float *pip = 3.141;

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

数组也可以用字符串常量进行初始化:

char a[] = "gooseberry";

与指针相反,由字符串常量初始化的数组时可以修改的,其中的单个字符在以后可以改变,比如下面的语句:

strncpy(a,"black",5);

就将数组的值修改为“blackberry”。


但是在使用数组时,数组总是可以写成指针的形式,两者可以互换。下图对这些情况进行了总结:


什么时候数组和指针相同

然而,数组和指针在编译处理时不同的,在运行时的表达形式也是不一样的,并不能产生不同的代码,对编译器而言,一个数组就是一个地址,一个指针就是一个地址的地址。

在C语言中所有非数组形式的数据实参均已传值形式(对实参作一份拷贝并传递给调用的函数,函数不能修改作为实参的实际变量的值,而只能修改传递给它的那份拷贝)调用。

数组/指针实参的一般用法

调用时的实参

类型

通常目的

Func(&my_int)

一个整型数的地址

一个int参数的传址调用

Func(my_int_ptr)

指向整型数的指针

传递一个指针

Func(my_int_array)

整型数组

传递一个数组

Func(&my_int_array[i])

一个整型数组某个元素的地址

传递数组的一部分

如果数组的长度比所提供的初始化值得个数要多,剩余的几个元素会自动设置为0,如果元素的类型是指针,那么它们被初始化为NULL,如果元素的类型是float,那么它们被初始化为0.0

0 0
原创粉丝点击