第八章 指针知识点

8.1指针是什么?

        由于通过地址能够找到所需要的变量单元,可以说,地址指向该变量单元。打个比方,一个房间的门口挂了一个房间号2008,

这个2008就是房间的地址,或者说,2008“指向”该房间。因此,将地址形象地称为“指针”。意思是通过它能找到以它为地址的内存单元。

1.地址和内容

2.值和类型

1). int a=112,b=-1;

       float c=3.14;

       int *d=&a;

       int *e=&c;

 

在这些声明中,变量a与b确实为用于整型数值,但是c声明为浮点数;上图,c的值确是整型。

这是取决于他们的使用方法,不能简单地通过检查一个值的位来判断它的类型 

类型
1个32位整数 1735159650
2个16位整数 26476和28514
4个字符 glod
浮点数 1.116533*e14
机器指令 beg.+110和beg.+102

 一个单一的值被解释为五个不同的类型,显然,值的类型取决于它的使用方法而非它的固有特性。

 3.指针变量

int a=112,b=-1;

float c=3.14;

int *d=&a;

float *e=&c;

如果你认为和e的值分别为112和3.14,那么你就错了,d和e被声明为指针并不会改变这些表达式的求值方式。一个变量的值就是分配给这个变量内存位置所储存的值。

d和e的值应该是a与c数值在内存单元的地址;

4.未初始化的指针和非法指针

例子:

int        *a;

……

*a=12;

        这个声明创建了一个名叫a的指针变量,后面那条赋值语句是把12储存在a所指向的位置。

但是a到底指向哪?我们声明了一个指针变量,但未对它初始化。我们无法得知12到底储存在哪里?

指针变量和其他变量一样,如果变量是静态的,它会被初始化为0;但如果是自动的,它不会被初始化。无论哪种情况,声明一个指向整形的指针都不会“创建”用于储存整型值的内存空间。

        如果程序执行这个操作,有可能a的初始值是一个非法的地址,这样的赋值语句将会出错,从而终止程序;另一种情况可能指向一个合法的地址。接下来这个位置的值会被修改,像这种类型的错误非常难以捕捉,所以在对指针进行间接访问之前,要非常小心,确保已经初始化。

 5.怎样定义指针变量

类型 * 指针变量名

1_指针变量名前的“*”,表示变量为指针变量,变量名为p;而不是*p;

2_在定义指针变量是必须指定基类型。一个指针变量只能指向一个类型的值;

3_指向整型数据的指针类型为“int *”;读作“指向int的指针”。

4_指针变量中只能存放地址;不能将一个整数赋给一个指针变量。

6.怎么引用指针变量

(1).给指针变量赋值。

int *p;

p=&a;

1_&是取地址符。&a是a的地址。

 

2_*指针操作符(“间接访问”运算符),*p代表指针变量p指向的对象。

二.指针变量作为函数参数

#include<stdio.h>
int main()
{
	void swap(int *p1,int *p2);
	int a,b;
	int *p1,*p2;
	printf("please enter a and b:");
	scanf_s("%d,%d",&a,&b);
	p1=&a;
	p2=&b;
	if(a<b)
		swap(p1,p2);
	printf("max=%d,min=%d\n",a,b);
	getchar();
	getchar();
	return 0;
}
void swap(int *p1,int *p2)
{
	int temp;
	temp=*p1;
	*p1=*p2;
	*p2=temp;
}

注意:不能通过改变指针形参的值来使指针实参的值改变。

 三,数组元素的指针

指针变量可以指向变量,也可以指向数组元素,所谓数组元素的指针就使数组元素的地址。

可以用一个指针变量指向一个数组元素。例如:

int a[10]={1,2,3,4,5,6,7,8,9,10};

int *p;

p=&a[0];

这是使指针变量p指向a数组的第0号元素,

p=&a[0]与p=a;使等价的;

1.在引用数组指针时指针的运算;

对地址进行的算数运算,对地址进行乘除的运算时没有意义的,在一定条件下可以进行加减运算。

当指针指向数组元素时,指针变量p指向数组元素a[0],我们希望用p+1表示指向下一个元素a[1];
 

在指针指向下一个数组元素时,可以对指针进行以下运算:

1_加一个整数(+或+=),如p+1;

2_减一个整数(用-或-=),如p-1;

3_自加运算,如p++,++p;

4_自减运算,如p--,--p;

5_两个指针相减,如p1-p2(只有p1与p2都指向一个数组的元素时,相减才有意义)。

如果指针变量p已指向数组的元素,则p+1指向同一数组中的下一个元素;同理,p-1则指向上一个元素。

这里的p-1和p+1,里面隐藏了一个乘法——p-1=(p-x*1),这里的x表示数组元素的类型的字节数,例如:int型,x=4;float型,x=4;

重点:*(p+5)与*(a+5)和a[5]是等价的。

说明:[ ]实际上是变址运算符,即将a[i]按a+i计算地址,然后找出地址单元中的值

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值