1. 内存
内存的概念
在计算机当中,所有的应用程序都将运行在一块特殊的区域,这块区域叫做“内存”。这块“内存”被计算机划分出了不同的区域,比如我们所熟知的:栈、堆等等。
内存很大,我们定义的变量如何标识它在内存当中的位置?计算机给每个“位置”通过“地址”进行定位。
2. 什么是指针变量
指针变量的定义
储存地址的变量
3. 指针类型与访问
3.1 指针类型
定义一个char类型的指针
#include<stdio.h> int main() { char c = 'a'; char* pc = &c; return 0; } 定义一个short类型的指针
#include<stdio.h> int main() { short s = 19; short* ps = &s; return 0; } 3.2 指针的访问
指针访问机制
指针的类型决定了指针访问的“能力”。
访问指针所指内存的操作,简称为:解引用操作。使用运算符*进行访问。
访问指针变量所指向内存的值
#include<stdio.h> int main() { int a = 10; int* p = &a; printf("%d\n",a);//输出变量a的值 printf("%d\n",*p);//输出指针变量p所指向内存a的值 return 0; } 输出结果:
10
10
修改指针变量所指向内存的值
#include<stdio.h> int main() { int a = 10; int* p = &a; printf("%d\n", a);//输出变量a的值 printf("%d\n", *p);//输出指针变量p所指向内存a的值 printf("通过指针修改变量内容\n"); *p = 199; printf("%d\n", a);//输出变量a的值 printf("%d\n", *p);//输出指针变量p所指向内存a的值 return 0; } 10
10
通过指针修改变量内容
199
199
4. 指针变量的大小
指针大小的决定因素
指针变量当中存储的是地址,存储地址所需的字节数由系统架构和编译环境决定。
- 32位系统:地址总线宽度为32位(4字节),最大寻址空间为 232 = 4GB
- 64位系统:地址总线宽度为64位(8字节),理论寻址空间为 264 字节(实际受操作系统限制)
观察下面代码分别在32位编译环境和64位编译环境下输出结果:
#include<stdio.h> int main() { printf("%zd\n", sizeof(char*)); printf("%zd\n", sizeof(short*)); printf("%zd\n", sizeof(int*)); printf("%zd\n", sizeof(double*)); return 0; } 结论:
- 32位平台下地址是32个bit位,指针变量大小是4个字节
- 64位平台下地址是64个bit位,指针变量大小是8个字节
- 注意指针变量的大小和类型是无关的,只要指针类型的变量,在相同的平台下,大小都是相同的。
5. 指针运算
指针的基本运算有三种,分别是:
- 指针 +- 整数
- 指针 - 指针
- 指针的关系运算
5.1 指针 +- 整数
因为数组在内存中是连续存放的,只要知道第一个元素的地址,顺藤摸瓜就能找到后面的所有元素。
int arr[10] = {1,2,3,4,5,6,7,8,9,10}; #include <stdio.h> int main() { int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int *p = &arr[0]; int i = 0; int sz = sizeof(arr)/sizeof(arr[0]); for(i = 0; i < sz; i++) { printf("%d ", *(p + i));//p+i 这里就是指针+整数 } return 0; }5.2 指针 - 指针
#include <stdio.h> int main() { int i = 0; int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int* p1 = &arr[1]; int* p2 = &arr[3]; printf("%d\n",p2-p1); return 0; } 要注意相减只能在一个数组里在两个数组地址相减将没有意义,且程序可能会崩溃。
5.3 指针的关系运算
#include <stdio.h> int main() { int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int *p = &arr[0]; int sz = sizeof(arr)/sizeof(arr[0]); while(p < arr + sz) //指针的大小比较 { printf("%d ", *p); p++; } return 0; }