📌 博客主页 爆打维c
本文将介绍指针基本知识点及易错点,刚入门学习c语言的小伙伴们可以收藏起来,方便找到。
目录
一、指针是什么?
1.const修饰指针
总结:
2.野指针
野指针成因:
3.指针数组与数组指针的区别
3.1指针数组:
指针数组模拟⼆维数组:
3.2数组指针
以上就是今天要讲的内容,本文仅仅简单介绍了指针的易错点及某些用法,而利用指针访问地址对我们c语言的学习有很重要的意义,本系列持续更新中.....
一、指针是什么?
我们知道计算上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中。
而定义一个变量会占用内存,在计算机中我们把内存单元的编号也称为地址。C语⾔中给地址起了新的名字叫:指针。
我们可以通过操作指针变量的值从而改变指针指向的那个变量的值。
所以我们可以理解为:
• 内存单元的编号 == 地址 == 指针
二、指针用法
1.const修饰指针
int a=10;
int b=20;
int*const p=&a;
p=&b; //error
*p=30; //a的值会被改变为30
int a=10;
int b=20;
int const*p=&a;
p=&b; //p指向变量b
*p=30; //error
const int*p与int const*p 等效
总结:
• const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。
但是指针变量本⾝的内容可变。
• const如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指
向的内容,可以通过指针改变。
2.野指针
•
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
野指针成因:
1.
指针未初始化
2.
指针越界访问
3.
指针指向的空间被释放
为防止野指针,对应的我们需要
1.
指针初始化
2.
注意
指针越界
3.
指针变量不再使⽤时,及时置NULL,指针使⽤之前检查有效性
3.指针数组与数组指针的区别
大家先看看下列例子哪个指针数组,哪个又是数组指针
int *p[10];
int (*p)[10];
教大家一种一眼就能看出来的方法:
指针变量先与什么结合就是什么
例1 p先与[ ]结合,那么它就是一个数组,是用来存放整型指针变量的数组。
例2 p先与 * 结合,那么它就是一个指针,指向一个整形数组的指针。
3.1指针数组:
~指针数组的每个元素是地址,⼜可以指向⼀块区域。
指针数组模拟⼆维数组:
代码如下:
#include <stdio.h>
int main()
{
int arr1[] = {1,2,3,4,5};
int arr2[] = {2,3,4,5,6};
int arr3[] = {3,4,5,6,7};
//数组名是数组⾸元素的地址,类型是int*的,就可以存放在parr数组中
int* parr[3] = {arr1, arr2, arr3};
int i = 0;
int j = 0;
for(i=0; i<3; i++)
{
for(j=0; j<5; j++)
{
printf("%d ", parr[i][j]);
}
printf("\n");
}
return 0;
}
parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型⼀维数组,parr[i][j]就是整型⼀维数 组中的元素。
上述的代码模拟出⼆维数组的效果,实际上并⾮完全是⼆维数组,因为每⼀⾏并⾮是连续的。