一、关于内存那点事
存储器:存储数据器件外存
外存又叫外部存储器,长期存放数据,掉电不丢失数据常见的外存设备:硬盘、flash、rom、u盘、光盘、磁带
内存
内存又叫内部存储器,暂时存放数据,掉电数据丢失常见的内存设备:ram、DDR
二、指针的相关概念
操作系统给每个存储单元分配了一个编号,从0x00 00 00 00~0xff ff ff ff
这个编号咱们称之为地址
指针就是地址
指针变量:是个变量,是个指针变量,即这个变量用来存放一个地址编号在 32 位平台下,地址总线是 32 位的,所以地址是 32 位编号,所以指针变量是 32 位的即4个字节。
注意:
1:
无论什么类型的地址,都是存储单元的编号,在 32 位平台下都是4个字节,
即任何类型的指针变量都是4个字节大小
2:
对应类型的指针变量,只能存放对应类型的变量的地址举例:整型的指针变量,只能存放整型变量的地址
扩展:
字符变量 char ch;ch 占1个字节,它有一个地址编号,这个地址编号就是 ch 的地址整型变量 inta;a占4个字节,它占有4个字节的存储单元,有4个地址编号。
三、指针的定义方法
1.简单的指针
数据类型 * 指针变量名;
int*p;//定义了一个指针变量p
在 定义指针变量的时候*是用来修饰变量的,说明变量p是个指针变量。变量名是 P
2.关于指针的运算符
& 取地址、* 取值
#include<stdio.h>
int main()
{
//定义一个普通变量
int a=100;
//定义一个指针变量
int *p;
//给指针变量赋值
p=&a;
//值
printf("a=%d,%d\n",a,*p);
//地址
printf("&a=%p,%p\n",&a,p);
return 0;
}
扩展:
如果在一行中定义多个指针变量,每个指针变量前面都需要加*来修饰
int "p,*q;//定义了两个整型的指针变量p和q
int*p,q;//定义了一个整型指针变量p,和整型的变量q
四、指针的分类 按指针指向的数据的类型来分
1:字符指针
字符型数据的地址
char *p;//定义了一个字符指针变量,只能存放字符型数据的地址编号
char ch:
p= &ch;
2:短整型指针
short int *p;//定义了一个短整型的指针变量 p,只能存放短整型变量的地址
short int a;
p =&a:
3:整型指针
int *p;//定义了一个整型的指针变量p,只能存放整型变量的地址
int a;
p =&a:
注:多字节变量,占多个存储单元,每个存储单元都有地址编号,c语言规定,存储单元编号最小的那个编号,是多字节变量的地址编号。
4:长整型指针
1ong int *p;//定义了一个长整型的指针变量p,只能存放长整型变量的地址
long int a;
p =&a;
5:float 型的指针
float *p;//定义了一个 foat 型的指针变量p,只能存放 foat 型变量的地址
float a;
p =&a:
6:double 型的指针
double *p;//定义了一个 double 型的指针变量p,只能存放 double 型变量的地址
double a;
p =&a:
7:函数指针
8:结构体指针
9:指针的指针
10:数组指针
总结:无论什么类型的指针变量,在32位系统下,都是4个字节,只能存放对应类型的变量的地址编号
五、指针和变量的关系
指针可以存放变量的地址编号
在程序中,引用变量的方法
1:直接通过变量的名称
int a;
a=100:
2:可以通过指针变量来引用变量
int *p;//在定义的时候,*不是取值的意思,而是修饰的意思,修饰p是个指针变量
p=&a;//取a的地址给p赋值,p保存了a的地址,也可以说p指向了a
*p= 100;//在调用的时候*是取值的意思 ,*指针变量 等价于指针指向的变量
注:指针变量在定义的时候可以初始化
int a:
int *p=&a;//用a的地址,给p赋值,因为p是指针变量指针就是用来存放变量的地址的。
*+指针变量 就相当于指针指向的变量
#include<stdio.h>
int main()
{
int *p1,*p2,temp,a,b;
p1=&a;
p2=&b;
printf("请输入a,b的值:\n");
scanf("%d,%d",&a,&b);
temp=*p1;
*p1=*p2;
*p2=temp;
printf("a=%d,b=%d\n",a,b);
printf("*p1=%d,*p2=%d\n",*p1,*p2);
return 0;
}