第14节 指针及其运算

一.每个变量在内存中占据一定的存储单元
1.变量的要素:变量名/变量值/存储单元.
2.操作变量:通过变量名,找到对应的存储单元,从而操作变量的值.
二.每个变量占据的存储单元都有地址
1.地址:内存区的每一个字节都有一个编号,成为地址.
2.变量类型决定对应占用内存单元的长度.

int i = 100;   //整型变量占4个字节;
float f = 2.3; //单精度浮点型变量占4个字节;
char c = 'k';  //字符型变量占1个字节;

3.指针:一个变量的地址,称为该变量的指针.
4.指针变量:如果一个变量是专门用来存放另一个变量的地址(指针)的,则它称为指针变量.

int* p;
p = &i;

三.内存单元的存取/访问方式
1.变量类型决定对应占用内存单元的长度

int i=100,j=200; //占4个字节
float f=2.3      //占4个字节

2.直接访问方式:通过变量名来对内存单元进行存取操作.

printf("%d",i); 直接访问i;

3.间接访问方式:通过指针变量,找到对应的存储单元进行操作

int* p;
p=&i;
printf("%d",*p); 间接访问i
指针变量(p)的值(*p),是另一个变量(i)的地址

四.与指针变量有关的运算符
1.两个与指针变量有关的运算符

& 取地址运算符
*  指针运算符
#include <stdio.h>
int main()
{
	int a = 3;        //&a为变量a的地址,a的值为3
	int* p = &a;      //变量p的值初始化为变量a的地址
	printf("int* p = &a; a = %d\n", *p); //*p为指针变量p所指向的内存单元
	int b = *p + 3;   //b的值?
	printf("int b = *p + 3; b = %d\n", b);
	int* point = &*p;  //?
	printf("int* point = &*p; point = %p\n", point);
	int c = *&a;      //?
	printf("int* c = *&a; c =  %d\n", c);
}
运行结果:
int* p = &a; a = 3
int b = *p + 3; b = 6
int* point = &*p; point = 008FFE84
int* c = *&a; c =  3

五.定义指针变量
1.指针变量定义示例

#include <stdio.h>
int main()
{
	int i, j;
	int* pointer_1, * pointer_2 = &j;//指向整型变量的指针变量;
	float* pointer_3 = NULL;//指向单精度型数据的指针变量;
	char* pointer_4;//指向字符数据的指针变量
	printf("%d", sizeof(pointer_1));//指针在内存中用4个字节保存;

2.定义指针变量时必须指定基类型
3.在32位平台中,每一个指针变量分配4个字节的存储单元,用来存放变量的地址.
六.通过指针变量访问整型变量(举例)

#include <stdio.h>
int main()
{
	int a, b;
	int* p1, * p2;
	a = 100;
	b = 10;
	p1 = &a;
	p2 = &b;
	printf("%d %d\n", a, b);
	printf("%d %d\n", *p1, *p2);
}
运行结果:
100 10
100 10

七.指针变量"指向"运算禁忌
1.不能对未赋值的指针变量作"指向"运算

#include <stdio.h>
int main()
{
	int a, b;
	int* p1, * p2;
	a = 100;
	b = 10;
	*p1 = 10;
	*p2 = 100;
	printf("%d %d\n", a, b);
	printf("%d %d\n", *p1, *p2);
}
以上程序有错误

2.不能用整数为一个指针变量赋值

#include <stdio.h>
int main()
{
	int a, b;
	int* p1, * p2;
	*p1 = 0x100000;
	*p2 = 0x100004;
	printf("%d %d\n", a, b);
	printf("%d %d\n", *p1, *p2);
}
以上程序有错误

八.用指针变量将两数按先大后小的顺序输出

#include <stdio.h>
int main()
{
	int a, b, * p1, * p2, * p;
	scanf_s("%d %d", &a, &b);
	p1 = &a;
	p2 = &b;
	if (a < b)
	{
		p = p1;
		p1 = p2;
		p2 = p;
	}
	printf("a = %d b = %d\n", a, b);
	printf("max = %d min = %d", *p1, *p2);
}
运行结果:
10 100
a = 10 b = 100
max = 100 min = 10

九.项目实践

十.点击测试

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值