指针基础
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跳过的是一个整型。