一、概念
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;
}
28万+

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



