C语言——指针

简介: C语言——指针

指针是什么?


指针是c语言中的一个重要概念,也是C语言的一个重要的特色,正确而灵活地运用它,可以使程序简洁,紧凑,高效,每一个学习和使用c语言的人,都应当深入了解地学习和掌握指针,可以说,不掌握指针就是没有掌握C的精华也可以说


指针是C语言的灵魂(doge)


由于通过地址能找到所需的变量单元,可以说,地址指向变量单元,打个比方,一个房间的门口挂了一个房间号2008,这个2008就是房间的地址,或者说,2008"指向"该房间.因此,将地址形象化地称为“指针”。意思是通过它能找到以它为地址的内存单元!


指针变量

bc4e90a85c814016b8eb6742b8bfbbea.png


使用指针变量的例子

例  通过指针变量访问整型变量


使用指针变量的例子
例  通过指针变量访问整型变量
int main() {
    int a = 100, b = 10;//定义整型变量a,b并初始化
    int* p1, * p2;     //定义指向整型数据的指针变量p1,p2;
    p1 = &a;          //把变量a的地址赋给指针变量p1
    p2 = &b;         //把变量a的地址赋给指针变量p2
    printf("a=%d,b=%d\n", a, b);//输出变量a和b的值
    printf("*p1=%d,*p2=%d\n", *p1, *p2);
        }

运行结果:

07ccff1542ae4d868be1bb8fce951f11.png


9da68a6c53774a1db27005fcb57d6e94.png


在开头处定义了两个指针变量p1和p2。但此时他们并未指向任何一个变量,只是提供两个指针变量,规定他们可以指向整型变量,至于指向哪一个整型变量,要在程序中指定.。程序第五第六行的作用就是使p1指向a,使p2指向b,此时p1的值为&a(即a的地址),p2的值为&b(即为b的地址)


*注意:定义指针变量时,左侧应有类型名,否则就不是定义指针变量.


例如:


58c12c5b825c4bba8838b90f2e6569ac.png


通过指针引用数组


所谓数组元素的指针就是数组元素的地址

可以用一个指针变量指向一个数组元素。例如

int arr[10]={1,3,5,7,9,11,13,15,17,19}; //定义a为包含10个整型的数组
int *p;                                //定义p为指向整型变量的指针变量
p=&a[0];                               //把a[0]元素的地址赋给指针变量p

&数组名vs数组名


int arr[10];


我们知道arr是数组名,数组名表示数组收元素的地址。

那么问题来了 &arr数组名到底是什么呢??

不如我们来段代码吧!

280d92f142fb47fa8f259014d926ce7f.png

由此可以得出数组名和&数组名打印的地址是一样的。

我们再来看一段代码!

00b3a68c3aa640f5978fbf9019055752.png


根据代码我们发现,其实&arr和arr,虽然值是一样的,但是意义应该不一样


实际上&arr表示的是数组的地址而不是数组首元素的地址。


数组的地址+1 跳过整个数组的大小,所以&arr+1相对于&arr的差值是40.


野指针


概念:野指针就是指针指向的位置是不可知的,(随机性的丶不正确的丶没有明确限制的)


野指针成因


指针未初始化

2ece7026c1a34f4dad5274f63ff5b03f.png


指针越界访问


1df1900f11db45cb9f89ad8cad807b23.png


如何避免野指针


1.指针初始化

2.小心指针越界

3.指针指向空间释放即使置NULL

4.避免返回局部变量的地址

5.指针使用之前检查有效性


指针运算


小时候我们就知道1+1等于几 那我问你如果是指针加1的话 加的是那个数字吗 ?

下面来看一段代码:


5bbd7d7c6a3c4fcbb2bb7153df246530.png


这里我们可以发现p跟p+1相差1

这里c是多少呢 ?

16进制的C的10进制是12,所以q+1和q相差4

p是整型指针相当于sizeof(int)=4

q是字符型指针相当于sizeof(char)=1;


相关文章
|
1月前
|
存储 C语言
【C语言篇】深入理解指针3(附转移表源码)
【C语言篇】深入理解指针3(附转移表源码)
34 1
|
13天前
|
C语言
【c语言】指针就该这么学(1)
本文详细介绍了C语言中的指针概念及其基本操作。首先通过生活中的例子解释了指针的概念,即内存地址。接着,文章逐步讲解了指针变量的定义、取地址操作符`&`、解引用操作符`*`、指针变量的大小以及不同类型的指针变量的意义。此外,还介绍了`const`修饰符在指针中的应用,指针的运算(包括指针加减整数、指针相减和指针的大小比较),以及野指针的概念和如何规避野指针。最后,通过具体的代码示例帮助读者更好地理解和掌握指针的使用方法。
40 0
|
12天前
|
C语言
【c语言】指针就该这么学(3)
本文介绍了C语言中的函数指针、typedef关键字及函数指针数组的概念与应用。首先讲解了函数指针的创建与使用,接着通过typedef简化复杂类型定义,最后探讨了函数指针数组及其在转移表中的应用,通过实例展示了如何利用这些特性实现更简洁高效的代码。
11 2
|
13天前
|
C语言
如何避免 C 语言中的野指针问题?
在C语言中,野指针是指向未知内存地址的指针,可能引发程序崩溃或数据损坏。避免野指针的方法包括:初始化指针为NULL、使用完毕后将指针置为NULL、检查指针是否为空以及合理管理动态分配的内存。
|
13天前
|
C语言
C语言:哪些情况下会出现野指针
C语言中,野指针是指指向未知地址的指针,通常由以下情况产生:1) 指针被声明但未初始化;2) 指针指向的内存已被释放或重新分配;3) 指针指向局部变量,而该变量已超出作用域。使用野指针可能导致程序崩溃或不可预测的行为。
|
19天前
|
存储 C语言
C语言32位或64位平台下指针的大小
在32位平台上,C语言中指针的大小通常为4字节;而在64位平台上,指针的大小通常为8字节。这反映了不同平台对内存地址空间的不同处理方式。
|
19天前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
19天前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
20天前
|
C语言
C语言指针(3)
C语言指针(3)
11 1
|
20天前
|
C语言
C语言指针(2)
C语言指针(2)
12 1