1.指针是什么
在计算机科学中,指针(pointer)是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”,意思是通过它能找到以它为地址的内存单元。
指针是一个变量,内存存放单元的地址(编号)
一个单元为1个字节
总结:
- 指针是用来存放地址的,地址是唯一标示一块地址空间的
- 指针的大小在32位平台是4个字节,在64位平台是8个字节
- 1个字节8位
#include <stdio.h>
int main()
{
int a = 10;
int *p = &a;
return 0;
}
2.指针和指针类型
#include <stdio.h>
int main()
{
printf("%d\n",sizeof(char*));
printf("%d\n",sizeof(short*));
printf("%d\n",sizeof(int*));
printf("%d\n",sizeof(double*));
return 0;
}
// 指针类型,在64位平台,输出结果均为8
指针类型 决定了指针进行解引用操作的时候,能够访问空间的大小
指针类型决定了:指针向前或向后走一步有多大距离
int *p; //*p能够访问4个字节
char *p; //*p能够访问1个字节
double *p; //*p能够访问8个字节
int *p+1; //*p跳过4个字节
char *p+1; //*p跳过1个字节
double *p+1; //*p跳过8个字节
通过指针把数组中每个元素都变成1(重要,值得参考)
#include <stdio.h>
int main()
{
int arr[10] = {0};
int *p = arr; // 数组名 -- 首元素的地址
int i = 0;
for(i = 0;i<10;i++){
*(p+i) = 1; // 把数组中的每个元素换成1
}
return 0;
}
总结:指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节),比如:char*的指针解引用就只能访问一个字节,而int*的指针的解引用就能访问4个字节。
3.野指针
int a; // 局部变量不初始化,默认是随机值
int *p; // 局部的指针变量,就被初始化随机值
指针变量未初始化、指针越界访问、指针指向的空间被释放(取局部变量的地址),都会产生野指针
3.1 如何规避野指针
1.指针初始化
#include <stdio.h>
int main()
{
int b = 0;
int a = 10;
int *p = &a; // 初始化
int *p = NULL; // NULL -- 用来初始化指针,给指针赋值
return 0;
}
2.小心指针越界
3.指针指向空间释放,即使其置NULL
4.指针使用之前检查有效性
4.指针运算
- 指针+-整数
- 指针-指针
得到的为中间元素的个数
- 指针的关系运算
指针可以比较大小
5.指针和数组
数组名为首元素的地址
#include <stdio.h>
int main()
{
int arr[10] = {0};
printf("%p\n", arr);
printf("%p\n", &arr[0]);
printf("%p\n", &arr);
return 0;
}
// 1. &arr --&数组名,数组名不是首元素的地址,数组名表示整个数组
// &数组名,取出来的是整个数组的地址
// 2. sizeof(arr) -- sizeof(数组名)--数组名表示的整个数组
// --sizeof(数组名)计算的是整个数组的大小
6.二级指针
#include <stdio.h>
int main()
{
int a = 10;
int *pa = &a;
int **ppa = &pa; // 二级指针
return 0;
}
7.指针数组
存放指针的数组,本质为一个数组
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
int c = 30;
int *arr[3] = {&a, &b, &c};
int i = 0;
for (i = 0; i < 3; i++)
{
printf("%d\n", *(arr[i]));
}
return 0;
}
// 整型数组 --存放整型
// 字符数组 --存放字符
// 指针数组 --存放指针