Chinaunix首页 | 论坛 | 博客
  • 博客访问: 151911
  • 博文数量: 20
  • 博客积分: 1515
  • 博客等级: 上尉
  • 技术积分: 305
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-14 10:06
文章分类

全部博文(20)

文章存档

2011年(2)

2010年(4)

2009年(14)

我的朋友

分类: 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]的代码*/

2.1.1什么是声明与定义(声明与定义必须相匹配)

l         定义:是一种特殊的声明,它确定对象的类型并分配内存,用于创建新的对象。只能出现一次。如:int myarray[10];

l         声明:描述对象的类型,用于指代其他地方定义的对象(例如在其他文件里)可以出现多次。如:extern int myarray[];

2.1.2数组和指针是如何访问的

Char *p = “abcdefgh”;

Char a[]=”abcdefgh”;

P[3],a[3],都可以提取到d,但得到的途径却是不相同的

2.1.3数组与指针的区别

如下定义:

Int mango[100];

mango数组定义了分配了100int的空间,而指针定义:

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         但是,数组与指针在编译器处理时是不同的,在运行时的表现形式也是不一样的。对编译器而言,一个数组就是一个地址,一个指针就是一个地址的地址。

2.2.1 C 语言标准对此的说明

l         规则1. 表达式中的数组名(与声明不同)被编译器当作一个指向该数组第一个元素的指针

l         规则2. 下标总是与指针偏移相同

l         规则3 在函数参数的声明中,数组名被编译器当作指向此数组第一个元素的指针

a[i]这样的形式对数组进行访问总是被编译器改写或解释为像*(a+1)这样的指针访问.

指针始终是指针。它绝不可以改写成数组,但可以用下标形式访问指针,一般都是指针作为函数参数时,而且你知道实际传递的是一个数组

2.2.2 为什么C语言把数组形参当作指针

 

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的长度,因此编译器编译时将对初值个数进行统计,并将这一准确数字填入数组的长度

阅读(1567) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~