C语言指针总结

本文详细讲解了C++中的指针概念,包括取地址操作符、解引用、不同类型的指针(如const和void)、野指针、数组名的使用、assert断言以及传址调用的作用。通过实例阐述了指针在编程中的关键作用和注意事项。
摘要由CSDN通过智能技术生成

指针基础

1.1取地址操作符和解引用操作符

1.2指针变量的大小

1.3const修饰指针和修饰指针变量

1.4void指针和指针加减整数

1.5指针运算和野指针

1.6assert断言

1.7指针的使用和传址调用

指针与数组的关系

2.1数组名的理解和使用指针访问数组

2.2一维数组和二维数组传参的本质

2.3指针数组

2.4函数指针数组

1.1  取地址操作符和解引用操作符       

先定义一个变量a,&a就是取出a的地址,然后用一个指针p来存放a的地址 , p就指向了地址a所以这个时候p里面存放的就是a的地址,打印出来结果就是一样的。然后就是解引用操作符(*)用解引用操作符就可以拿到a里面的数字。*p就是a,然后用解引用操作符就可以修改a的值,结果如下 1.2指针变量的大小    

   指针变量的大小只和环境有关,与类型无关。都是4个或者8个字节大小 :32位 / 8位 = 4个字节,64位 / 8位 = 8个字节1.3const修饰指针和修饰指针变量 

       

当用const修饰指针变量的时候这个时候就不可以修改a的值,可以改地址,而当const修饰指针的时候,可允许改值,但是不允许改地址                                                                                              1.4void指针和指针加减整数

void指针就是无类型的指针,可以改变她的类型,在不知道指针里面存放的是啥类型时,就可以使用void指针;可以看到的pp的地址比p的地址多了4,是因为int类型占四个字节,所以跳过的是变量类型占的的字节数,如果是char*类型的话,一次跳过一个字节

1.5指针运算和野指针

野指针就是指针指向的位置是不可知的(随机的、不正确的)
如果明确知道指针指向哪⾥就直接赋值地址,如果不知道指针应该指向哪⾥,可以给指针赋值NULL.
NULL 是C语⾔中定义的⼀个标识符常量,值是0,0也是地址,这个地址是⽆法使⽤的,读写该地址会报错

1.6assert断言

assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报
错终⽌运⾏。这个宏常常被称为“断⾔
assert() 的使⽤对程序员是⾮常友好的,使⽤ assert() 有⼏个好处:它不仅能⾃动标识⽂件和
出问题的⾏号,还有⼀种⽆需更改代码就能开启或关闭 assert() 的机制。如果已经确认程序没有问
题,不需要再做断⾔,就在 #include <assert.h> 语句的前⾯,定义⼀个宏 NDEBUG
# define NDEBUG
# include <assert.h>
1
2
然后,重新编译程序,编译器就会禁⽤⽂件中所有的 assert() 语句。如果程序⼜出现问题,可以移
除这条 #define NDBUG 指令(或者把它注释掉),再次编译,这样就重新启⽤了 assert()
1.7指针的使用和传址调用
传址调⽤,可以让函数和主调函数之间建⽴真正的联系,在函数内部可以修改主调函数中的变量;所以未来函数中只是需要主调函数中的变量值来实现计算,就可以采⽤传值调⽤。如果函数内部要修改 ,主调函数中的变量的值,就需要传址调⽤。下面举个例子
可以看到修改了形参的值,实参不会变,这个时候就用到了指针的传址调用,下面就示一下s
可以看到,把地址传过去就可以修改a,b的值了。
2.1数组名的理解和使用指针访问数组
数组名就是首元素的地址,&数组名拿到的是整个数组的地址,下面我们用代码来演示
可以看到&arr+1和&arr结果相差了正好28个字节,所以&arr+1跳过的是整个数组,arr+1跳过的是一个整型。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值