指针
什么是指针?
指针就是一个地址,通过地址进而间接获得值。
组成:数据类型 *指针变量;==》 int *p;(当前指针的类型为:int型)。
记住一句话,指针永远指向地址,如果不指向地址,那么就是错误的。
那在C语言程序当中怎么实现间接取值呢?
例:
include <stdio.h>
int main()
{
int data=10;//定义一个整型变量data,值为10
int *p;//定义一个指针变量p
p=&data;//把data地址赋值给p
printf("打印输出*p:%d",*p);//指针p就可以间接取到data的值10
return 0;
}
地址
什么是地址?
地址就是存储的位置信息,地址是不变的,但是地址上的变量是可变的。
野指针
什么是野指针?
野指针就是:当前指针的指向的地址是随机的、不可知的。
野指针成因:
1.指针没有初始化。
当我们定义一个指针变量的时候没有让它指向任何对象。
#include <stdio.h>
int main()
{
int *p;
*p=10;
printf("%p",*p);//打印为:000000000000000A
return 0;
}
2.指针越界
#include <stdio.h>
int main()
{
int arr[3]={11,22,33};
int *p=arr;
int i;
for(i=0;i<4;i++)
{
printf("%d\n",*p++);
}
return 0;
}
打印结果:

明显可以看出,数组arr只有3个元素,但是for循环却执行4次,导致指针越界生成一个随机数3。
如何避免野指针?
善于使用NULL,及时对指针进行初始化。NULL是空的意思
int *p=NULL;//此时p就是一个空指针,后面可重新赋值,不影响使用。
避免指针的越界。清楚指针的指向范围,防止越界。
指针数组
指针数组的定义:数据类型 *指针变量名[元素的个数]。
int * p[5];
本质上就是一个数组,只不过它是由多个指针变量构成的。指针变量存放各自指向的地址。
定义3个指针存入指针数组m,它们各自指向的地址为abc、def、g。(地址随便取的)
#include <stdio.h>
int main()
{
char *p="abc";
char *q="def";
char *t="g";
char *m[]={p,q,t,NULL};
for(int i=0;m[i]!=NULL;i++)
{ printf("%s\n",m[i]);
}
return 0;
}
循环输出结果为:

数组指针
数组指针定义:数据类型(*指针变量名)【元素的个数】
int (*p)[5];
本质上它就是一个指针,它是存在于二维以及多位数组中的行指针。
指针函数
指针函数的定义: 数据类型 * 指针变量(参数)
int * p();
可以返回指针值的函数。
函数指针
函数指针的定义: 数据类型 * 指针变量(参数)
int (*p)();
指向函数的指针。
多级指针
定义:1.一级指针保存的是变量的地址。2.二级指针保存一级指针的地址。 3.三级指针保存的二级指针的地址。
#include <stdio.h>
int main()
{
int data=10;
int*a=&data;
int **b=&a;
int***c=&b;
return 0;
}
上述为一级指针、二级指针和三级指针,如此类推。。。
指针和数组
指针和数组的区别
数组和指针不是一个东西。
数组能够存放一组数,连续的空间,数组的大小取决于元素个数。
指针是一个变量,是存放地址的。
#include <stdio.h>
int main()
{
int arr[4] = { 11,22,33,44 };
int* p = arr;
int i = 0;
int len = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < len; i++)
{
printf("%d ", *(p + i));
}
return 0;
}
输出结果:

二维数组
关于二维数组a的有关指针和地址取值如下图一、二所示。
int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};

(图一)

(图二)
总结
以上为本人浅薄见解,作为学习记录,希望对你有所帮助,让我们一起变得更强!
哈哈哈哈哈,加油哦!下期再会。
