指针介绍

指针就是用来存储变量的地址,&为取地址符,&a 将变量a的地址取出。

#incluude<stdio.h>
int main()
{
int a=10;
int* p=&a;//将变量a的地址取出,放到变量p,p即为指针变量名
}

指针就是变量,是用来存储地址的变量。

一个小的变量单元为1个字节,32位的平台中指针的大小为4个字节,64位平台中指针的大小为8个字节。

指针的定义方式为​​type+*​​。例如char* int* 

指针类型意义

指针+-整数

C语言指针学习_数组

指针类型决定了​指针向前或向后移动了几个字节,如上图pa为变量a的地址,类型为int*,pa+1为指针向后平移了4个字节,pc的类型为char*,pc+1为指针向后平移了一个字节。

指针的解引用

指针类型决定在访问内存空间时权限的大小,即int*类型:*pc可以访问内存4个字节大小的空间,char*:*pc类型访问内存空间的1个字节。

C语言指针学习_野指针_02

野指针

野指针定义:指针指向的位置是不可知的,随机的。

野指针成因

1、指针未初始化

#include<stdio.h>
int main()
{
int* p;//此时指针未初始化,局部变量指针未初始化时,默认为随机值
*p=20;//在解引用的时候,20的地址是随机的
return0;
}

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;
}

如何规避野指针

1、 指针初始化(也就是在指针定义的时候设定初始值,保证该指针指向一个内存空间)

2、小心指针越界

3、指针指向空间释放及时置NULL

4.、指针使用之前检查有效性(判断指针不为空指针时候)

#include <stdio.h>
int main()
{
int *p = NULL;
//....
int a = 10;
p = &a;
if(p != NULL)//使用指针之前需判断其有效性,当其不是空指针时的情况
{
*p = 20;
}
return 0;
}

指针运算

指针+-整数

指针-指针 

#include<stdio.h>
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,13};
printf("%d\n",&arr[9]-&arr[0]);//结果为指针中间元素的个数 9
return 0;
}

指针的关系运算

C语言指针学习_数组_03

允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。(即P1可以与P2进行比较,但是P1不能与P3进行比较,会越界)

指针和数组

数组名表示的是数组首元素的地址。既然可以把数组名当成地址存放到一个指针中,我们使用指针来访问一个就成为可能。所以 p+i 其实计算的是数组 arr 下标为i的地址。那我们就可以直接通过指针来访问数组。

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;
}

二级指针

指针数组

指针数组-存放指针的数组