C语言指针:
首先,CPU从内存中读取数据和指令,然后在返回内存中;
计算机能够识别,存储,运算的时候都是使用的二进制的形式;
总结:
1,内存会被划分为一个个的内存单元,每个内存单元的大小是一个字节
2,每个内存单元都会给一个编号 == 地址 == C语言中也让叫 指针;
指针变量类型的意义:
变量创建的本质就是在内存中开辟一块空间;
图片中的int 就是整型 是4个字节,右边就是在内存中为 a 开辟的空间是4个字节,每个字节都是有地址的,用来存储25;
&a --- 取出a的地址 & ---- 取地址符号
&a 取出的是a的4个字节中第一个字节的地址(较小的地址)
pa是指针变量,是需要向内存申请空间的,这样才能存放地址;
指针变量需要多大的空间,取决于存放的是什么?存放的是地址;
地址存放需要多大的空间,指针变量的大小就是多大;
1,指针其实就是地址, 2,指针变量就是存放指针(地址)的
口头语中的说的指针一般都是说的指针变量
64位机器上:地址是64个0/1的二进制序列,存储起来需要64个bit位,也就是8个字节, 指针变量大小就是8个字节.
32位机器上:地址是32个0/1的二进制序列,存储起来需要32个bit位,也就是4个字节, 指针变量大小就是4个字节.
int* 指针解引用访问的是4个字节;
char* 指针解引用访问的是1个字节;
结论:
指针类型决定了指针进行解引用操作的时候能访问多大的空间.
说明:指针类型决定了指针的步长,就是向前或向后走一步多大的距离;
type* (p+i); p+i 就是跳过i 个type类型的数据,相当于跳过了i * sizeof(type)个字节;
const 修饰指针
const 与 * 的位置关系 以及*const和const*的用法;
C语言程序中的const用来修饰指针;
例:int a = 10中的a 可被修改;但是const int a = 10中的a不能被修改;但是a的本质还是一个常变量;const在c++中就是常量;
例:const int* p =&a;
const在*左边时:限制的是*p,意思是不能通过p来改变p指向的对象的内容,但是p本身是可以改变的,p可以指向其他对象; 如: int m = 0; p = &m;
例:int* const p =&a;
const在*右边时:限制的是p,意思是不能修改p的本身的值,但是p指向的内容是可以通过p来改变的;
如:int m = 0; *p = m;
例:const int * const p =&a;
两边都不能更改;p 本身和p所指向的内容都不能改;
指针基本运算有三种: 指针 +- 整数 ; 指针 - 指针 ; 指针的关系运算;
指针+-整数:是表示指针所在的位置跳过多少个元素 *(p + i); i 表示跳过的元素个数
指针-指针:准确来说是指针-指针的绝对值得到的是指针和指针之间的元素个数
指针2 - 指针1 = i;
指针-指针的前提条件: 是两个指针指向同一块空间,同类型都不行;
指针就是地址,地址就是指针,地址-地址 == 指针-指针;
野指针:
概念:野指针就是指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)
局部变量不初始化的时候就是野指针;
int* p 不初始化就是随机值 --野指针; 需要提供限制,设置成空指针;int* p = NULL;
局部变量的地址是不能返回的,返回之后原局部变量的地址就已经销毁;不然返回的int* p就成为了野指针;
传值调用:
当实参传递给形参的时候,形参是有自己独立的空间的,形参是实参的一份临时拷贝,对形参的修改,不会影响实参;
传址调用:
传地址时:其实数组名就是数组首元素的地址; arr == &arr[0];
数组名的理解:
1,数组名是数组首元素的地址(但是有两个例外)
a.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
b.&数组名,这里的数组名也表示整个数组,取出的是整个数组的地址
除此之外,所有的数组名都是数组首元素的地址;
&arr --- 是数组的地址 &arr + 1 ---就是跳过了一个数组;
[] --仅仅只是个操作符 *(arr + i) == *(i+arr) ==i[arr];
一维数组传参:
1.一维数组传参的时候,传过去的是数组首元素的地址;
2,形参的部分可以写成指针的形式,也可以写成数组的形式,但本质上都是指针写成数组的形式是为了方便
test(arr):这里的arr没有单独放在sizeof的内部,也没有&,所以arr是数组首元素的地址,
二级指针变量就是用来存放一级指针变量的地址;
谢谢大家的阅读,希望对大家有帮助!!!