数据结构指针详解
二、数据结构预备知识(1)——指针
前言
本系列文章是基于郝斌《数据结构入门》教学视频的笔记,如有不妥之处欢迎指正
目录
- 前言
- 指针的重要性
- 指针相关定义
- 指针与函数
- 数组与指针
-
- 数组元素与内存地址的关系
- 数组与指针的关系
- 数组、指针、函数
指针的重要性
- 指针是C语言的灵魂
指针相关定义
- 地址:是内存单元的编号(16进制数),是从0开始的非负整数,其范围(32位CPU)为0——FFFFFFFFH(0——4GB-1)1
- 指针:指针就是地址,地址就是指针
- 指针变量:存放内存地址的变量,均占4个字节的空间
- 指针的本质:指针是一个操作受限的非负整数(不能加、乘、除,仅能在某些情况下相减)
- 内存分配:操作系统将内存的使用权限给予程序
- 内存释放:操作系统回收该部分内存的使用权限,但是但是并不会清空内存中的遗留数据
#include<stdio.h>
int main()
{
int *p;
int i=10;//p是个指针变量
//int *表示该p变量只能存储int类型的地址
int j;
p = &i; //将i的地址传递给p
p = 10; //错误,编号为10的地址不一定是系统分配给程序的存空间,将会导致程序崩溃
j=*p; //等价于j = i
return 0;
}
指针与函数
#include<stdio.h>
void f(int *p)//不是定义了一个名字叫做*p的形参
//而是定义了一个形参,该形参的名字叫做p,他的类型是 int *
{
*p = 100;
}
int main()
{
int i = 9;
f(&i); //i的地址发送给p
//&叫做取地址符
printf("i = %d",i);
return 0;
}
以上程序的输出结果为
i = 100
数组与指针
数组元素与内存地址的关系
- 一个数组的元素在内存中一定是连续存放的
#include<stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
printf("%p\n",a); //%p表示输出该变量的内存地址
printf("%p\n",a+1);
printf("%p\n",a+2);
printf("%p\n",a+3);
printf("%p\n",a+4);
return 0;
}
程序运行的结果为
000000000061FE00
000000000061FE04
000000000061FE08
000000000061FE0C
000000000061FE10
可以看出数组的内容在内存中是连续存放的(int 型变量占用4个字节)
数组与指针的关系
- 一维数组名存放的是数组的第一个元 素的地址即一维数组名是个指针常量
- 数组下标与指针的关系
a[i] <<==>> *(a+i)
#include<stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
printf("%d\n",*a+1); //*a+1等价于a[0]+1
printf("%d\n",*(a+2));
return 0;
}
输出结果为
2
3
数组、指针、函数
- 通过被调函数(f())修改主调函数(main())中一维数组的内容
#include<stdio.h>
void f(int *p,int len)
{
p[2] = -1; //p[0] == *p
//p[2] == *(p+2) == *(a+2) == a[2]
//此处不能用a[]因为a这个变量并不在本函数内
//p[i]就是主函数的a[i]
}
int main()
{
int a[5]={1,2,3,4,5};
f(a,5); //a等价于&a[0], &a[0]本身就是 int *类型
printf("%d",a[2]);
return 0;
}
输出结果为
-1
-
关于内存和CPU关系的知识详见《微机原理》 ↩︎