分类: C/C++
2009-05-18 01:43:02
1) 什么是指针
l 指针是一种保存变量地址的变量
l 指针是能够存放一个地址的一组存储单元(通常是两个或4个字节)
l *是间接寻址或间接引用运算符(间接寻址是在直接寻址的基础上面建立起来的,也就是直接寻址得到的数据是一个地址,通过这个地址找到最终的数据,也就是两次寻址,第一次得到的是地址,第二次才是目标数据。)
l 例:
Int x = 1,y=2;
Int *ip; /*ip 是指向int类型的指针*/
Ip = &x; /*ip现在指向x*/
Y = *ip; /*y现在的值为1*/
*ip = 0; /*x现在的值为0*/
2)注意
l 指针只能指向某种特定类型的对象(void 类型可以存放指向任何类型的的指针,但不能间接引用其自身)
2.1指针与数组有哪些不同
对数组的引用总是可以写成对指针的引用,而且确实存在一种指针和数组的定义完全相同的上下文环境。但并非所有情况下都如此。
如:
int mango[10];
int *p;
p=mango;
但这种情况下不行:
文件1:
int mango[10];
文件2:
extern int *mango;
…/*一些引用 mango[i]的代码*/
l 定义:是一种特殊的声明,它确定对象的类型并分配内存,用于创建新的对象。只能出现一次。如:int myarray[10];
l 声明:描述对象的类型,用于指代其他地方定义的对象(例如在其他文件里)可以出现多次。如:extern int myarray[];
Char *p = “abcdefgh”;
Char a[]=”abcdefgh”;
P[3],a[3],都可以提取到d,但得到的途径却是不相同的
如下定义:
Int mango[100];
mango数组定义了分配了100个int的空间,而指针定义:
Int *raisin;
则申请了一个地址容纳该指针。指针的名字是raisin,它可以指向任何一个int变量(或int 型数组 )。指针变量raisin本身始终位于同一个地址,但它的内容在任何时候都可以不同,指向不同地址的int变量。这些不同的int变量可以有不同的值。Mango数组的地址并不能改变,在不同的时候它的内容可以不同,但它总是表示100个连续的内存空间。
数组与指针的其它区别:
指针 |
数组 |
保存数据的地址 |
保存数据 |
间接访问数组,首先取得指针的内容,把它作为地址,然后从这个地址提取数据。如果指针有一个下标[I],就是把指针的内容加上I作为地址,从中提取数组 |
直接访问数据。a[I]只是简单的以a+I 为地址取得数据 |
通常用于动态数据结构 |
通常用于存储固定数目且数据类型相同的元素 |
相关的函数为malloc(),free() |
隐式分配和删除 |
通常指向匿名数据 |
自身即为数据名 |
注意:
我们知道通常情况下定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间。但有一咱情况例外:定义时同时赋值给指针一个字符常量进行初始化。如:
cahr *p = “breadfruit”;
对别的类型就不行:
float *pip = 3.14; /* 错误*/
在ANSI C中,初始化指针时所创建的字符串常量被定义为只读(有些编译器会把它放在只允许读取的文本段中,以防止它被修改)
2.2指针和数组在什么时候是相等的
l 声明:除函数参数外,指针和数组的声明和定义一定要一致,数组不能改写成指针形式,但在函数参数里可以自由选择
l 在表达式中使用:表达式中可以自由选择数组形式或者是指针形式
如 char myarray[10];
char *mypty;
….
i = strlen(myarray);
j = strlen(myptr);
printf(“%s %s”,myarray,mypty);
l 但是,数组与指针在编译器处理时是不同的,在运行时的表现形式也是不一样的。对编译器而言,一个数组就是一个地址,一个指针就是一个地址的地址。
l 规则1. 表达式中的数组名(与声明不同)被编译器当作一个指向该数组第一个元素的指针
l 规则2. 下标总是与指针偏移相同
l 规则3 在函数参数的声明中,数组名被编译器当作指向此数组第一个元素的指针
用a[i]这样的形式对数组进行访问总是被编译器改写或解释为像*(a+1)这样的指针访问.
指针始终是指针。它绝不可以改写成数组,但可以用下标形式访问指针,一般都是指针作为函数参数时,而且你知道实际传递的是一个数组
1) 什么叫指针数组
l 由于指针本身也是变量,所以它们也可以像其它变量一样存储在数组中。存储指针的数组就是指针数组
例:char*lineptr[1024];
它表示lineptr是一个具有1024个元素的一维数组,其中数组的每个元素是一个指向字符类型对象的指针。
2) 指针数组的好处
方便管理,节省开销。
l 指针结构的初始化语法和一般类型的初始化语法类似
例:
Char *name[]= {
“Illegalmonth”,
“January”,”Fbruary”,”March”,
“April”,”May”,”june”,
“July”,”August”,”September”,
“October”,”November”,”Decmber”
};
这里并没有指明数组name的长度,因此编译器编译时将对初值个数进行统计,并将这一准确数字填入数组的长度