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

被折叠的 条评论
为什么被折叠?



