初识C指针(3)

来源:互联网 发布:上海市政分院 知乎 编辑:程序博客网 时间:2024/06/05 19:17

指针与数组


指针变量除了可以对其引用的地址的内容进行运算外,其本身也可以进行运算。指针是内存中的一个地址,对指针本身的支算只能是指针在内存中位置的改变,即指针可以进行加,减运算,其结果是另一个内存地址。

由于指针运算的结果也是一个内存地址,为了使该地址是一个程序中的合法地址,指针的运算通常都是针对数组进行的。

在指针进行运算前,必须先将指针指向一个数组,当指针指向数组时,可以时行如下的运算:
指针加上一个整数,结果是指向该数组另一个元素的地址;
指针减去一个整数,结果是指向该数组另一个元素的地址;
指针自增(++),结果是指针指向该数组的下一个元素;
指针自减(--),结果是指针指向该数组的上一个元素;
两个指针相减(要求两个指针都指向同一数组的元素),结果为两个指针相对移动的元素个数;
比较两个指针的大小(要求两个指针都指向同一数组的元素),实质上是比较两个指针所指数组元素下标的大小。

例:
int *p1,*p2,b;
int a[8]={1,3,5,7,9,11,13,15};
p1=a;  /*p1指向数组首元素地址,相当于p=&a[0]*/
p2=a;  /*同上*/
p1++;  /*p1指向数组中下一个元素,即a[1]*/
b=*p1; /*把p1所指元素内容赋给b,此时b=3*/
b=*(p1+2);/*把p1当前地址加2,即:将p1后第2个元素内容赋给b,此时b=7,但p1本身未改变*/
b=*p1+2;   /*把P1所指元素内容加2后赋给b,此时b=a[1]+2=5*/
if(p1>p2) /*比较两个指针所指数组元素的下标*/
b=p1-p2;  /*将p1中减去p2,其实是将p1与p2所指数组元素的下标相减,求得两元素间的下标差值,由于此时p1指向a[1],p2指向a[0],则b=p1-p2=1-0=1*/

从上面的内容我们知道,指针可以用来对数组进行访问。数组的指针是指数组在内存中的起始地址,数据元素的指针是指数组元素在内存中的起始地址。
数组名也可以理解为一个指针,不过数组名是一个指针常量,不能改变。可以用数组名来将数组的首地址赋给指针。数组指针的定义与普通指针的定义方法相同,数组指针的引用即可以用指针方式来进行,也可以用数组下标的方式来进行。如果指针p是指向数组a[]首元素的指针,则*(p+n)等价于a[n],如果指针p是指向数组元素a[k]的指针,则*(p+n)等价于a[k+n].

字符串指针


定义一个字符型指针,使该指针指向字符串起始地址,就可以使用该指针来进行字符串的引用,这个指针称为字符串的指针。也就是说,并不是把字符串赋给指针变量,而是把字符串的地址赋给了指针变量。
例如:
char *指针变量名;   /*定义时不初始化*/
char *指针变量名=字符串常量;  /*定义时进行初始化赋值*/

char *s="this is a test !";
char *str="hello world! ";

上面的语句定义了字符串指针s和str,分别指向字符串"this is a test!"和"hello world!"在内存中的起始地址。
在字符串指针变量中,仅存储字符串常量的首地址,字符串常量的内容由系统自动为其分配存储空间,并在字符串尾加上结束符号'\0'。

除了在定义时对指针进行初始化赋值外,也可以在程序中进行赋值。
char *s;
char *str;
s="this is a test!";
str"hello world!";

字符指针和字符数组

1、字符指针与字符数组的关系
字符指针也可以用于指向一个字符数组的首地址,以此来引用该字符数组的内容,如:
char str[]="Turbo C 2.0";
char *s;
s=str;
在使用语句 "s=str" 将字符数组的首地址赋给字符指针s后,就可以使用字符指针s来对字符数组进行引用。

使用指针与数组进行字符串处理的不同这处是,指针可以通过赋值运算进行改变,而数组名则不能改变。例如:
char str[]="Turbo C 2.0";
char *s;
s=str;   /*正确用法,指针可以进行赋值*/
s++;     /*正确用法,指针可以进行自增运算*/
str=s;   /*错误用法,数组名是常量,指向一个固定的内存地址,不可进行赋值运算*/

字符数组一旦定义,其使用的存储空间就是固定的,在任何时候都可以使用数组名对数组进行访问。字符指针变量只是一个指向内存地址的指针,它在程序中改变后将不再指向原来的内容。

字符数组只能在初始化时进行字符串的整体赋值,在程序运行中则不能;而字符指针变量既可以在初始化时进行字符串的整体赋值,又可以在程序运行中进行赋值,因为字符指针只是一个指针,在程序中是可变的。

字符数组名是一个常量,在程序中只能引用,不能改变;而字符指针是一个变量,在程序中可以指向任一位置,因此应该注意指针的位置,以防止引用出错。

还有一点注意的是,通过指向字符串的指针变量或字符数组名可以一次性输入整个字符串,但对于其它类型的数组却不能一次整体输出,下面是错误的用法:

int a[]={1,2,3,4,5};
int *p;
p=a;
printf("%d",p); /*错误的用法*/
pritnf("%d",a); /*错误的用法*/

上面的程序中的printf("%d",p)和pritnf("%d",a) 语句,并不能输出数组的所有元素,在这里输出的只是数组的首地址。在需要通过指针输出数组的所有元素时,只能通过循环来完成。

指针数组

可以将一个数组定义为指针类型,称为指针数组。
指针数组定义如下:
数据类型 *数组名[下标];
如:
char *str[5];
上面的语句定义了一个有5个元素的字符指针数组,数组的每一个元素是一个字符指针,可以像单个字符指针一样引用数组中的每一个字符指针。

int main(void)
{
    char *str[3];
 str[0]="this is a test!";
 str[1]="hello world!";
 str[2]="Turbo C";
 
 printf("%s\n",str[0]);
 printf("%s\n",str[1]);
 printf("%s\n",str[2]);
 
 return 0;
}


指针数组和字符串数组不同的是:指针数组常用于多个字符串的处理,而字符串数组只能处理单个字符串。

 

鸭绿江导购网 专业的导购平台

原创粉丝点击