1.指针是什么?
指针理解的
2
个要点:
1.
指针是内存中一个最小单元的编号,也就是地址
2.
平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
指针变量:
我们可以通过&(取地址操作符)去除变量的内容其实地址,把地址可以存放到一个变量中,这个
变量就是指针变量。
总结:
指针变量,用来存放地址的变量。
(存放在指针中的值都被当成地址处理)。
指针变量在32位机器和64位机器上的大小:
32位:4个字节
64位:8个字节
2.指针和指针类型:
指针是有意义的:
1.指针的解引用:
指针的类型决定了,指针进行解引用操作的时候一次性访问几个字节
例:如果是char*类型的指针,解引用访问1个字节
如果是int*类型的指针,解引用访问4个字节
float----------------------------------------4个字节
2.指针+-数字:
指针的类型决定了指针向前或向后走一步有多大。(
指针+1到底跳过了几个字节)
3.野指针
野指针成因:
1.指针未初始化:
#include <stdio.h>
int main()
{
int *p;//局部变量指针未初始化,默认为随机值
*p = 20;
return 0;
}
2.指针越界访问:
#include <stdio.h>
int main()
{
int arr[10] = {0};
int *p = arr;
int i = 0;
for(i=0; i<=11; i++)
{
//当指针指向的范围超出数组arr的范围时,p就是野指针
*(p++) = i;
}
return 0;
}
3.指针指向的空间释放。
如何规避野指针:
1.指针初始化。
2.小心指针越界。
3.指针指向释放空间,及时置NULL。
4.避免返回局部变量的地址。
5.指针使用之前要检查有效性。
4.指针运算
1.指针+-整数
#define N_VALUES 5
float values[N_VALUES];
float *vp;
//指针+-整数;指针的关系运算
for (vp = &values[0]; vp < &values[N_VALUES];)
{
*vp++ = 0;
}
2.指针-指针
求字符串长度;
int my_strlen(char *s)
{
char *p = s;
while(*p != '\0' )
p++;
return p-s;
}
得到的是两个指针之间元素的个数。
3.指针的关系运算;
接下来有两段代码:
for(vp = &values[N_VALUES]; vp > &values[0];)
{
*--vp = 0;
}
for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--)
{
*vp = 0;
}
下面这段代码是错误的,实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避
免这样写,因为标准并不保证 它可行。
标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与
指向第一个元素之前的那个内存位置的指针进行比较。
5.指针和数组
1.指针是一种变量,存储地址的,大小位4/8字节
数组是一组相同元素的集合,可以当多个元素的集合,大小是取决于元素个数元素类型的。
2.数组的数组名是数组的首元素地址,地址放在指针变量中,可以通过指针访问数组。
6.二级指针
int main()
{
int a = 0;
int* pa = &a;
int** ppa = &pa;//ppa就是一个二级指针
return 0;
}
二级指针是用来存放一级指针的地址的。
应用:使用一维数组,来模拟一个二维数组
#include<stdio.h>
int main()
{
int a[] = { 1,2,3,4 };
int b[] = { 2,3,4,5 };
int c[] = { 3,4,5,6 };
int* arr[3] = { a,b,c };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
基本原理如图所示
7.指针数组
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
int c = 30;
int d = 40;
int e = 50;
int* arr[5] = { &a,&b,&c,&b,&e };
int i = 0;
for (i = 0; i < 5; i++)
{
printf("%d ", *(arr[i]));
}
return 0;
}
指针数组是数组,是存放指针的数组。