第五章-指针

一、指针的概念

操作系统给每个存储单元分配了一个编号,从 0x00 00 00 00 00 ~0xff ff ff ff 称之为内存

指针变量:是变量也是指针变量,这个变量用来存放一个地址编号。在 32 位系统下,有 4 个字节

注:

​ 1、无论声明类型的地址,都有存储单元的编号,在 32 位下都是 4 个总控二。所以 任何类型的指针变量都是 4 个字节

​ 2、对应类型的指针变量,只能存放对应类型的变量地址

​ 比如:整形的指针变量,就是存放整型变量的地址

扩展:

字符变量 char ch; ch 占一个字节,它有一个地址编号,这个地址编号就是 ch 的地址整型变量 int a; a 占四个字节,占有四个字节的存储单位,有四个地址编号

1692111175278

二、指针的定义方法

1、简单指针

数据类型 * 指针变量名

1
2
int * P;
//定义一个指针变量P

2、指针的运算符

& 取地址 :获取一个变量的地址

*取值:标识作用

1692111376174

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main(){
int a = 100;
int * p;//指针变量
p = &a;//a的地址保存在p中

printf("a = %d %d\n",a,*p);
ptintf("&a = %p %p\n",&a,p);
}

1692111480916

3、指针大小

在 32 位系统下,所以类型的指针都是 4 个字节

三、指针的分类

1、字符指针

​ char *p;//只能存放字符串类型的地址编号

​ char ch;

​ p = &ch;

2、短整型指针

​ short int *p;

​ short int a;

​ p =&a;

3、整形指针

​ int *p;

​ int a;

​ p =&a;

4:长整型指针

long int *p;

long int a;

p =&a;

5:float 型的指针

float *p;

float a;

p =&a;

6:double 型的指针

​ double *p;

​ double a;

​ p =&a;

7:函数指针

8、结构体指针

9、指针的指针

10、数组指针

四、指针和变量的关系

指针可以存放变量地址编号

1、变量的名称引用变量

​ int a;

​ a=100;

2、通过指针变量引来变量

​ int *p;

​ p =&a;//p 保存了 a 的地址,也可以说 p 指向了 a

​ *p=100;

注意:指针变量的定义可以初始化

int a;

int *p=&a;//指针就是存放变量地址的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main(){
int *p1,*p2,temp,a,b;
p1=&a;
p2=&b;

printf("输入a b的值:\n");
scanf("%d %d",p1,p2);//70 90
temp = *p1;//p1指向a的值给temp赋值 70
*p1 = *p2;//p2指向b的值给p1的变量a赋值 90
*p2 = temp;//temp给p2指向的变量b赋值 70
printf("a=%d b=%d\n",a,b);
printf("*p1=%d *p2=%d\n",*p1,*p2);
}

1692112482696

扩展:

对应类型的指针,只能保存对应类型数据的地址

如果想让不同类型的指针互相赋值,需要强制类型转换

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main(){
int a=0x1234,b=5678;
char *p1,*p2;
printf("%#x %#x\n",a,b);
p1=(char *)&a;
p2=(char *)&b;
printf("%#x %#x\n",*p1,*p2);
p1++;
p2++;
printf("%#x %#x\n",*p1,*p2);
}

1692113002001

1692113028355

五、指针和数组元素之间的关系

1、数组元素和指针的基本关系

变量存放在内存中,有地址编号,定义的数组,是的哟个相同类型的变量的集合。每个变量都占内存空间,都有地址编号。指针变量可以存放数组元素的地址(数组首元素)

1
2
3
4
int a[10];
//int *p =&a[0];
int *p;
p=&a[0]; //指针变量p保存了数组a中第0个元素的地址,即a[0]的地址

2、数组元素的引用方式

(1)数组名[下标]

1
2
int a[10];
a[2]=100;

(2)指针名加下标

1
2
3
4
int a[10];
int *p;
p=a;
p[2]=100;

(3)指针运算加取值

1
2
3
4
int a[10];
int *p;
p = a;
*(p+2)=100;//a[2]=100
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main(){
int a[5]={0,1,2,3,4};
int *p;
p=a;

printf("a[2]=%d\n",a[2]);//2
printf("p[2]=%d\n",p[2]);//2

printf("*(p+2) = %d\n",*(p+2));//2
printf("*(a+2) = %d\n",*(a+2));//2

printf("p=%p\n",p);
printf("p+2=%p\n",p+2);
printf("&a[0] = %p\n", &a[0]);
printf("&a[2] = %p\n", &a[2]);
}

1692113975759