C语言程序设计 密码开锁 指针的介绍

本文通过一个简单的C语言程序实例,解释了指针在内存地址和变量值之间的关系。代码展示了如何使用指针获取和修改变量的值,包括地址运算符(&)和指针解引用(*)的用法。此外,还强调了指针变量的初始化和空指针(NULL)的概念。通过对指针的深入理解,读者可以更好地掌握C语言中内存管理和数据访问的技巧。

例8-1 :利用指针模拟密码开锁游戏。
课本给出的代码

//获取密码的两种方法
#include<stdio.h>
int main()
{
	int x=5342;//变量x用于存放密码值5342
//程序中定义了变量x来存放密码,再定义一个特殊的指针变量p,用于存放变量x的地址
//这样既可以通过变量名x直接得到密码值,也可以在不知道变量名的情况下,通过指针变量p所存放的x的地址 间接找到密码值 
	int *p=NULL;//定义整型指针变量p,NULL值为0,代表空指针
	p=&x;//将变量x的地址存储在p中,&是取址符
	//通过变量名x输出密码值
	printf("If I know the name of the variable, I can get it's value by name: %d\n",x);
	//通过变量x的地址输出密码值
	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; 
}

地址和指针是计算机中两个重要概念。
内存单元和内存单元的地址:如果把存储器看成一个建筑物,建筑物内的房间就是存储器单元,房间号就是地址。

指针和指针变量在含义上存在一定差异。
一般来说,在C语言中,指针被认为是一种概念,是计算机内存地址的代名词之一。
而指针变量本身就是变量,和一般变量不同的是 它存放的是地址。
大多数情况下,并不特别强调它们的区别。

指针是用来存放地址的变量。
&:地址运算符
*:指针声明符

定义多个指针变量时,每一个指针变量前面都必须加上*

指针变量的类型 不是指 指针变量本身的类型,而是指 它所指向的变量的数据类型
无论何种类型的指针变量,它们都是用来存放地址的,所以尽管不同类型的变量所占的内存空间不同,但不同类型指针变量所占的内存空间大小都是相同的。

指针变量要先赋值再使用,当然指针变量被赋的值应该是地址。
下面有四条赋值语句:

p=&i;

p=0;
p=NULL;

p=(int*)1732;

第一条是最常用的,指针p被看做是 指向变量i,或者指针p存放变量i的地址。
第二三条是把特殊值0赋值给指针p,此时p表示空指针,C语言中的空指针不指向任何单元。
第四条使用强制转换 (int*) 来避免编译错误,指针p指向 地址为1732的int型变量。不提倡用这种语句。

p=&i; 指针p指向变量i,*p 和 i 访问同一个存储单元。

//取地址运算和使用指针 访问变量 
#include<stdio.h>
int main()
{
	int a=3,*p;//定义整型变量 a和整型指针 p
	p=&a;//把变量 a的地址赋给指针 p,即 p指向 a
	printf("a=%d , *p=%d\n",a,*p);//输出变量a的值 和指针p所指向变量的值 
	
	*p=10;//对指针 p所指的变量赋值,相当于对变量 a赋值 
	printf("a=%d, *p=%d\n",a,*p);
	
	printf("Enter a: ");
	scanf("%d",&a);//输入一个 a的值 
	printf("a=%d, *p=%d\n",a,*p);
	(*p)++;//指针 p所指的变量++,相当于变量 a++
	//*p=*p+1、++*p都是将指针 p所指向变量的值加 1 
	printf("a=%d, *p=%d\n",a,*p);
	return 0;
}

表达式 * p++ 等价于 * (p++),
先取*p的值作为表达式的值,再将指针p的值加1,运算后,p不再指向变量a

#include<stdio.h>
int main()
{
	int a=1,x,*p;
	p=&a;
	printf("%d\n",p);
	x=*p++;
	*p=2;//p不再指向变量 a 
	printf("%d %d %d %d\n",a,*p,x,p);
	return 0;
}

对于指针变量的初始化,不能用数值作为指针变量的初值,但0除外。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值