指针学习1

目录

引入:如何得到密码值?

1、地址和指针:

1)内存单元

2)内存单元标识编号

3)地址

4)指针

5)scanf中的&

2、指针变量的定义

1)一般形式

2)定义类型

3)指针关联

3、指针的基本运算

1)引言

2)取地址运算和间接访问运算

3)赋值运算

4、指针变量的初始化

1)引言

2)初始化的注意事项

5、本学习章节模拟练习(引言问题)

6、本章存疑


引入:如何得到密码值?

1、直接法:直接由输入的进行输出
2、间接法:即指针。定义一个特殊的指针变量p,用于存放输入密码的地址,这样就可以通过指针变量p来间接得到密码值

1、地址和指针:


1)内存单元

在C语言中,如果定义了一个变量,在编译时就会根据该变量的类型给它分配相应大小的内存单元。


以下列举相应类型名的内存单元:
int型:2  char型:1  float型:4  double型:8


2)内存单元标识编号

计算机为了对应单元中的数据进行操作,一般是按“地址”存取的,也就是说对内存单元进行标识编号。

例如:int型变量的存储长度为两个字节,因此C语言编译器将它们分配到地址为1000-1001、1002-1003和1004-1005的内存单元中。


如图:


3)地址

在C语言中还有一种使用变量的方法,即通过变量的地址进行操作:用指针访问内存的操纵 地址。

例如在一个变量p中,它位于2000单元,该单元存放x,地址为1000,就可通过变量p间接访问变量x。

4)指针

与直接使用变量x相比较,使用变量p访问变量实现了对变量x的间接操作。在C语言中把这种专门用来存放变量地址的变量成为指针。即指针使用来存放内存地址的变量,例如上题中p指针变量指向变量x。

5)scanf中的&

例如scanf("%d",&n),这里的就是把输入值存储到变量n所在的内存单元里。&n表示变量n的内存地址和存储位置。&为运算地址符,且为一元运算符,拥有从右到左的结合性。

2、指针变量的定义

1)一般形式

定义指针的一般形式为:
类型名  *指针变量名;
类型名必须为有效的数据类型,

如:int,float,double,char……


指针变量名是指针变量的名称,必须是一个合法的标识符。
*为指针声明符,指针被定义的时候使用,说明被定义的那个量是指针。
且在定义多个指针时,每个指针变量前都要加*。

2)定义类型

定义指针变量所指内存空间上所存放数据的类型。

以下为一些例子:
int  *p;
char  *cp;
float  *fp;
double  *dp1,*dp2; //定义两个指针变量dp1和dp2,指向双精度实型变量


!!!指针变量的类型不是指指针变量本来的类型,而是指它所指向的变量的数据类型。所以指针变量自身所占的内存空间的大小和它所指向的变量数据类型无关,不同类型指针变量所占的内存空间大小都是相同的!!!

3)指针关联

指针变量在定义后,必须将指针变量和一个特定的变量进行关联后才可以使用它,指针变量也需要先赋值后使用,被赋的值是地址!

例如:
int i,*p;
//以下对指针变量p进行赋值:
p = &i;  //指针p和指针关联起来,p存放变量i的地址,这是最常用的指针赋值方法
p = 0;  //把特殊值0赋给指针p,此时指针的值为NULL
p = NULL;  //NULL在系统文件stdio.h中被定义,其值为0
p = (int*)1732;  //用强制类型转换来避免编译错误,表示p指向地址为1732的变量,不常用,但NULL除外

!注意:定义指针时需要用到指针的标识符*,但指针声明符并不是指针的组成部分。

3、指针的基本运算

1)引言

通过指针间接访问变量可由取地址计算符&和间接访问运算符*完成。
此外,相同类型的指针还能进行赋值、比较和算数运算。

2)取地址运算和间接访问运算

&(单目运算符)用于给出变量的地址
!!!注意:指针的类型和它所指向变量的类型必须相同!!!

例如主要形式:
int *p,a = 3;
p = &a;
以上,*p的值就是a的值!

如图: 

 

3)赋值运算

指针的赋值运算与其他类型一样
!!!注意:只能将一个指针的值赋给另一个相同类型的指针!!!

例如:
(*p)++ 与 *p++的意义完全不同

4、指针变量的初始化

1)引言

C语言中变量都是在引用前需先赋初值,而指针变量也一样,也需要对其赋初值再引用。

2)初始化的注意事项

!指针在定义时前面的*只表示定义的是一个指针变量,不是乘法运算符,也不是间接访问符。
!把一个变量的地址赋初值给一个指针变量时,该变量必须在此之前就要被定义。原因为:
指针变量所指向的是变量的地址,只有赋了初值的变量才有地址。
!可用已经赋了初值的指针变量给另一个指针变量进行初始化。
!不能用数值来对指针变量进行赋初值,除了0这个特殊数值外,在stdio.h系统中被认定为
NULL的值,是一个空指针。
!指针定义时的数据类型必须和它所指向目标变量的数据类型保持一致。原因为:不同数据类型
在存储单元中所占的字节数不同。

5、本学习章节模拟练习(引言问题)

——利用指针模拟密码开锁的游戏:

要求:分别用变量名和指针变量(地址)来输出密码值
代码如下:

#include <stdio.h>
int main(void)
{
	int a = 5342;//用来存储密码的变量名,并赋给它密码值 
	
	int *p = NULL;//定义一个指针变量,用来访问变量的地址
	
	//以下对指针进行赋初值
	p = &a;
	//赋值完毕!
	
	//以下按题目要求进行密码值的输出
	printf("If I know the name of the variable, I can get it's value by name: %d\n",a);
	printf("If I know the address of the variable is: %x, then I also can get it's value by address: %d\n",p,*p);
	//输出完毕! 
	
	return 0;
} 

运行结果如下:

6、本章存疑

最后代码段的输出地址为何值?
此题本人输出与书本不一致。

此后慢慢学习研究……


 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值