c语言(10)—指针(1)基础概念及简单运算

 一、概念

1. 地址:为了区分内存中不同字节的编号(寻址范围:0 - 2^64 -1)

2. 指针:指针就是地址,地址就是指针,指针比地址多了指向的概念

3. 指针变量:存放指针(地址)的变量称为指针变量(64位操作系统中所有指针变量均为8个字节)

注:内存大小端:内存低地址存放低数据位,内存小端;内存低地址存放高数据位,内存大端

二、运算符

1. &:取地址运算符,获得变量在内存空间中的首地址

只有变量(左值)才能&,常量和表达式不能进行&操作;&构成的表达式值为变量在内存空间中的首地址;&构成的表达式类型位:变量的类型升级后的类型

2。*:获得指针指向的空间,或者对应空间中的值

*运算符连接的内容必须为指针类型,不能是普通变量类型;如果直接使用*对应的表达式,表达式值为:该指针指向空间中的值;如果使用*对应的表达式其类型为:指针类型降级后的类型

三、指针变量的定义

1.方法:存储类型 数据类型 *变量名;(不能使用未经初始化的指针)

e.g.  int *p;

       char *p;

       float *p

2.野指针:未经初始化的指针或者指向已经被释放空间的指针,称为野指针

3.空指针:指向内存地址为0x0的指针称为空指针,用NULL来表示;内存地址0x0空间为只读空间,不能赋值,NULL指针不能执行*p = value操作

4.访问:可以通过访问内存中的地址来间接访问变量(不会受限于函数)

int num = 0;

int *p = NULL;

p = #

*p;

四、.指针的算数运算

1. 算数运算符:指针偏移的大小由指针指向的数据类型大小决定,两个指针相减得到的结果为,两个地址间相差的数据类型元素个数

e.g.下面代码p和q相差四个字节即一个int,所以相差第一个输出的值为1;p自加1或自减1即加减四个字节,所以后两个输出为0x4和空

1 #include <stdio.h>
  2 
  3 int main(void)
  4 {
  5     int *p = NULL;
  6     int *q = (int *)0x4;
  7 
  8     printf("%ld\n", q - p);
  9     p++;
 10     printf("p = %p\n", p);
 11     p--;
 12     printf("p = %p\n", p);                                                            
 13 
 14     return 0;
 15 }

 2.不同指针类型之间的区别

*操作时处理方式不同:

char *: 取0x2000开始的1个字节空间数据

int *: 取0x2000开始的4个字节空间数据

float *: 取0x2000开始的4个字节空间数据

  double *:取0x2000开始的8个字节空间数据

算数运算:

char *: 偏移量为1个字节

int *: 偏移量为4个字节

float *: 偏移量为4个字节

double *:偏移量为8个字节

五、指针常见操作:

int a = 100;

int b = 200;

int *p = NULL;

int *q = NULL;

p = &a;

q = &b;

q = &a;    //让指针q指向a

*q = a;    //将a的值赋值给q指向的空间(q依旧指向b,改变的是b的值)

*p = *q;   //将q指针指向的空间中的值赋值给p指针指向的空间

p = q;     //将指针变量q中的值赋值给指针变量(p变成了指向b)

注:对指针变量p或者q修改,改变的是指针的指向;对*p或者*q操作,改变的是指针指向的空间,指针还是指向原有的空间

六、指针作为函数参数

地址传递:实参将地址传递给形参,形参是指向实参的指针,可以利用形参修改实参的值

注:函数体内部想修改函数体外部变量值的时候,使用地址传递

e.g.利用地址传递实现最大公约数和最小公倍数的传输

思路:首先编写主函数,定义两个输入的变量和两个接收地址的变量;其次编写被调函数,输入四个值,分别是两个整型变量和两个地址变量,通过逻辑用前两个变量编写完成后,用两个地址接收最终输出的数;最后在主函数调用被调函数输出结果。

#include <stdio.h>

int GetGongYueGongBei(int x, int y, int *pyueshu, int *pbeishu)
{	
	int max = 0;
	int min = 0;
	int i = 0;

	min = x < y ? x : y;
	for (i = min; i > 0; i--)
	{
		if (0 == x % i && 0 == y % i)
		{
			break;
		}
	}
	*pyueshu = i;
		
	max = x > y ? x : y;
	for (i = max; i <= x * y; i++)
	{
		if (0 == i % x && 0 == i % y)
		{
			break;
		}
	}
	*pbeishu = i;

	return 0;
}

int main(void)
{
	int num1 = 0;
	int num2 = 0;
	int maxyueshu = 0;
	int minbeishu = 0;

	scanf("%d%d", &num1, &num2);

	GetGongYueGongBei(num1, num2, &maxyueshu, &minbeishu);

	printf("最大公约数:%d\n", maxyueshu);
	printf("最小公倍数:%d\n", minbeishu);

	return 0;
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值