指针1

C语言指针详解

一,指针概念
在信息工程中指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中寄存器(Register)。指针一般出现在比较近机器语言的语言,如汇编语言或C语言。面向对象的语言如Java一般避免用指针。指针一般指向一个函数或一个变量。在使用一个指针时,一个程序既可以直接使用这个指针所储存的内存地址,又可以使用这个地址里储存的变量或函数的值 。由于通过地址能找到所需的变量单元,可以说地址指向该变量单元。打个比方,一个房间的门口挂了一个房间号2008,这个2008就是房间的地址,或者说2008指向该房间。因此,将地址行象化的称为指针。意思是通过它能找到以他为地址的内存单元。
注意: 请务必弄清楚存储单元的地址和存储单元的内容这两个概念的区别。
二,指针变量
1,指针变量的定义
定义指针变量的一般形式为:类型名指针变量名
例:int pointer_1,pointrer_2;
注意:
(1)指针变量前面的 “
”表示该变量为指针型变量。指针变量名是pointer_1和pointrer_2,而不是
pointer_1和
pointrer_2。
(2)在定义指针变量时必须指定基类型。一个变量的指针的含义包括两方面,一是以存储单元编号表示的纯地址(如编号为2000的字符),一是它指向的存储单元的数据类型(如int,char,float等)。
(3)如何表示指针类型。指针整型数据的指针类型表示为“int*”,读作“指向int的指针”或简称“int指针”。
(4)指针变量中只能存放地址(指针),不能将一个整数赋给一个指针变量。
(5)指针变量的引用
例如: int *p1;

表示p1是一个指针变量,它的值是某个整型变量的地址。或者说p1指向一个整型变量。至于p1究竟指向哪一个整型变量,应由向p1赋予的地址来决定。

再如:

int *p2; /p2是指向整型变量的指针变量/

float *p3;      /*p3是指向浮点变量的指针变量*/

char *p4; /p4是指向字符变量的指针变量/

应该注意的是,一个指针变量只能指向同类型的变量,如P3 只能指向浮点变量,不能时而指向一个浮点变量,时而又指向一个字符变量。
2,指针变量作为函数参数
函数参数不仅可以是整型,浮点型,字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。
例:
#include <stdio.h>

void swap(int a, int b){
int temp; //临时变量
temp = a;
a = b;
b = temp;
}

int main(){
int a = 66, b = 99;
swap(a, b);
printf(“a = %d, b = %d\n”, a, b);
return 0;
}
3,通过指针引用数组
C语言规定:如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。
引入指针变量后,就可以用两种方法来访问数组元素了。
如果p的初值为&a[0],则:
p+i和a+i就是a[i]的地址,或者说它们指向a数组的第i个元素。
(p+i)或(a+i)就是p+i或a+i所指向的数组元素,即a[i]。例如,(p+5)或(a+5)就是a[5]。
指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价。
根据以上叙述,引用一个数组元素可以用:
下标法:即用a[i]形式访问数组元素。在前面介绍数组时都是采用这种方法。
指针法:即采用*(a+i)或*(p+i)形式,用间接访问的方法来访问数组元素,其中a是数组名,p是指向数组的指针变量,其处值p=a。
【例10-9】输出数组中的全部元素(下标法)。
main(){
int a[10],i;
for(i=0;i<10;i++)
a[i]=i;
for(i=0;i<5;i++)
printf(“a[%d]=%d\n”,i,a[i]);
}
【例10-10】输出数组中的全部元素(通过数组名计算元素的地址,找出元素的值)。
main(){
int a[10],i;
for(i=0;i<10;i++)
(a+i)=i;
for(i=0;i<10;i++)
printf(“a[%d]=%d\n”,i,
(a+i));
}
【例10.11】输出数组中的全部元素(用指针变量指向元素)。
main(){
int a[10],i,*p;
p=a;
for(i=0;i<10;i++)
(p+i)=i;
for(i=0;i<10;i++)
printf(“a[%d]=%d\n”,i,
(p+i));
}
【例10-12】
main(){
int a[10],i,*p=a;
for(i=0;i<10;){
*p=i;
printf(“a[%d]=%d\n”,i++,*p++);
}
}
几个注意的问题。

  1. 指针变量可以实现本身的值的改变。如p++是合法的;而a++是错误的。因为a是数组名,它是数组的首地址,是常量。
  2. 要注意指针变量的当前值。请看下面的程序。
    【例10-13】找出错误。
    main(){
    int *p,i,a[10];
    p=a;
    for(i=0;i<10;i++)
    *p++=i;
    for(i=0;i<10;i++)
    printf(“a[%d]=%d\n”,i,*p++);
    }
    【例10-14】改正。
    main(){
    int *p,i,a[10];
    p=a;
    for(i=0;i<10;i++)
    *p++=i;
    p=a;
    for(i=0;i<10;i++)
    printf(“a[%d]=%d\n”,i,*p++);
    }
  3. 从上例可以看出,虽然定义数组时指定它包含10个元素,但指针变量可以指到数组以后的内存单元,系统并不认为非法。
  4. p++,由于++和同优先级,结合方向自右而左,等价于*(p++)。
  5. (p++)与(++p)作用不同。若p的初值为a,则*(p++)等价a[0],*(++p)等价a[1]。
  6. (*p)++表示p所指向的元素值加1。
  7. 如果p当前指向a数组中的第i个元素,则:
    *(p–)相当于a[i–];
    *(++p)相当于a[++i];
    *(–p)相当于a[–i]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值