目录
1.指针的概念
2.指针类型(意义)
2.1指针加减整数
2.2指针的解引用(指针的权限)
3.野指针
3.1野指针成因
3.2如何避免野指针
4.指针运算
4.1指针+-整数
4.2指针-指针
4.3指针的关系运算
5.指针和数组
6.二级指针
7.指针数组
1.指针的概念
- 指针是内存中一个最小单元的编号,也就是地址(内存单元 - 编号 - 地址 - 指针)
- 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
总结:指针就是地址,口语中说的指针通常指的是指针变量。
指针变量即用来存放地址的变量。(存放在指针中的值都被当成地址处理)
int a = 10;
int* pa = &a;? //pa是一个指针变量
- 指针是用来存放地址的,地址是唯一标示一块地址空间的。
- 指针的大小在32位平台是4个字节,在64位平台是8个字节。
2.指针类型(意义)
2.1指针加减整数
指针类型决定了指针向前或向后走一步有多大距离(单位是字节)
int*? -->? 4(字节byte)
char*? -->? 1
double*? -->? 8
#include <stdio.h>
int main()
{
int n = 10;
char *pc = (char*)&n;
int *pi = &n;
printf("%p\n", &n);
printf("%p\n", pc);
printf("%p\n", pc+1);
printf("%p\n", pi);
printf("%p\n", pi+1);
return 0;
}
2.2指针的解引用(指针的权限)
指针类型决定了其在解引用时一次能访问几个字节。
比如 char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。
#include <stdio.h>
int main()
{
int n = 0x11223344;
char *pc = (char *)&n;
int *pi = &n;
*pc = 0; //重点在调试的过程中观察内存的变化。
*pi = 0; //重点在调试的过程中观察内存的变化。
return 0;
}
3.野指针
概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
3.1野指针成因
3.2如何避免野指针
- 指针初始化
- 小心指针越界
- 指针指向空间释放及时置NULL
- 避免返回局部变量的地址
- 指针使用之前检查有效性
4.指针运算
指针和指针相减得到的是元素相差的个数,不是字节!!
4.1指针+-整数
4.2指针-指针
以设计一个求字符串长度的函数为例:
int my_strlen(char *s)
{
char *p = s;
while(*p != '\0' )
p++;
return p-s;
}
4.3指针的关系运算
示例
#define N_VALUES 5
float values[N_VALUES];
float *vp;
//指针+-整数;指针的关系运算
for(vp = &values[N_VALUES]; vp > &values[0];)
{
*--vp = 0;
}
标准规定:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与 指向第一个元素之前的那个内存位置的指针进行比较。
5.指针和数组
数组名表示的是数组首元素的地址。
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,0};
int *p = arr; //指针存放数组首元素的地址
int sz = sizeof(arr)/sizeof(arr[0]);
for(i=0; i<sz; i++)
{
printf("&arr[%d] = %p <====> p+%d = %p\n", i, &arr[i], i, p+i);
}
return 0;
}
p+i 其实计算的是数组 arr 下标为i的地址。
那我们就可以直接通过指针来访问数组。
如下:
&arr [ i ]?? <==>? ?*(p + i)
#include <stdio.h>
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int *p = arr; //指针存放数组首元素的地址
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i<sz; i++)
{
printf("%d ", *(p + i));
}
return 0;
}
6.二级指针
#include <stdio.h>
int main()
{
int a = 10;
int* pa = &a;
int** ppa = &pa; //ppa就是一个二级指针
//int*** pppa = &ppa; //pppa就是三级指针
return 0;
}
7.指针数组
指针数组也是一个数组,即存放指针的数组。
int main()
{
int arr[10]; //整型数组 - 存放整型的数组
char ch[5]; //字符数组 - 存放字符的数组
//指针数组 - 存放指针的数组
int a = 10;
int b = 20;
int c = 30;
int* arr2[] = { &a, &b, &c }; //存放整型指针的数组
return 0;
}
|