-
指针 pointer
-
指针与硬件联系紧密,使用指针可操作数据的地址
-
计算机存储机制
-
每个字节都存在一个地址进行数据的存储
-
int,short,小端存储,从右往左一个字节一个字节顺序放置
-
数组按从左往右一个字节一个字节存储
-
-
-
-
指针\地址
-
每个字节的编号称为地址
-
字节编号,固定,虚拟,不可变,常量
-
-
优点,加快访问速度
-
-
指针变量
-
可变,存储指针\地址的容器
-
-
指针的大小
-
64位操作系统
-
8字节
-
-
32位操作系统
-
4字节
-
-
-
传递参数
-
使用指针传递输出参数,利用主函数和子函数使用同一套数据的特性,实现数据的返回,可实现多返回函数的设计
-
-
指针的定义格式
-
存储类型 数据类型说明符 *指针变量名
-
* 是指针的标志
-
在表达式*p使用时为取值运算符
-
在定义中为说明符
-
-
存储类型
-
auto \ static \ register \ extern \ const \ volatile
-
-
数据类型
-
基本类型 , 构造类型 , 空类型 , 指针类型
-
-
int *p;
-
int* 为p的数据类型
-
int 指针指向地址对应值的类型,即为指针变量p加减的字节偏移量
-
-
void *a
-
通用类型指针,可以指向任意类型的地址,但是需要类型强转,多用于传参和返回
-
-
-
-
指针的定义及初始化
-
指针的类型和地址一致
-
int a = 100; int *p = &a;
-
指针变量指向a的地址
-
-
-
指针的类型和地址不一致
-
int a = 128; char *p = &a;
-
当指针变量加减时的值为数据类型char类型的对应字节
-
-
-
不可使用未初始化的指针
-
野指针 :非法访问内存空间,轻则报错,重则死机
-
-
当定义指针不知指向谁时,可指向NULL
-
int *p = NULL;
-
就是0地址,该地址主要用于指针的指向,地址指向的内存很小,小到不可使用
-
-
-
指针可以给另一个指针初始化
-
int a = 100; int *p = &a; int *q = p;
-
容易生成悬垂指针
-
当通过p释放a的内存,a内存自由,但是q依旧指向a的地址
-
-
-
-
指针变量不可直接赋值
-
只能赋值已经赋值的指针变量,其具有分配的地址
-
-
-
解引用和取地址
-
解引用 *
-
取地址 &
-
-
指针的运算符
-
算术运算
-
指针的加减运算 : int a[] = {1,2,3,4}; int *p = &a;
-
p + n
-
加减的是指针指向地址 加减 指针变量对应类型字节大小 * n
-
-
*p + n
-
先取p指向的值,再对值加一
-
先地址偏移再取值
-
-
*(p + n)
-
p++
-
对指针变量p进行地址偏移对应类型字节大小
-
-
指针之间做差,值为两指针之间的差数
-
-
-
关系运算
-
< > <= >= == !=
-
条件成立返回1 不成立返回0
-
多用于连续的地址(数组)
-
-
-
-
赋值运算
-
= 基本赋值
-
int a = 100; int *p = &a;
-
指针变量p指向变量a的地址 等号的左右两边类型需统一
-
不统一时以指针变量的类型为运算类型
-
-
-
-
+=
-
p += 1;
-
p向高地址方向偏移一个数据类型所占字节大小
-
-
-
-=
-
p -= 1;
-
p向低地址方向偏移一个数据类型所占字节大小
-
-
-
-
-
存储类型
-
auto
-
功能:自动变量
-
内存:栈区
-
不可修饰全局变量,可修饰局部变量
-
局部变量的存储类型默认为auto
-
-
-
static
-
格式:static int a = 0;
-
功能:静态变量,延长局部变量的生命周期到本文结束,但作用域不变
-
生命周期:内存的申请到释放 作用域:实际使用的行数
-
-
内存:静态区(.bss\,ro\.txt)
-
修饰函数
-
该函数生命周期为本文件,不可跨文件调用
-
-
-
register
-
寄存器变量
-
不可对其修饰的变量进行取地址操作
-
-
extern
-
引用外部变量
-
静态区
-
函数和全局变量的存储类型默认为extern
-
不可引用静态类型的变量
-
-
const(修饰词)
-
功能:修饰的变量不可变
-
内存
-
修饰的全局变量内存 在只读段
-
修饰的局部变量内存 在栈区
-
-
const和指针的结合
-
-
volatile(修饰词)
-
防止内存优化,保证内存的可见性
-
存在无意义的语句时保证其不会被优化
-
-
-
-
函数指针数组
-
本质上是一个数组,存储多个函数指针
-
格式:存储类型 数据类型 (*函数指针数组变量名[常量表达式])(参数列表)
-
int Sum(int a,int b); int Sub(int a,int b); int Mul(int a,int b); int (*p1)(int ,int ) =Sum; int (*p2)(int ,int ) = Sub; int (*p3)(int ,int ) = Mul; int (*p)(int,float) = {Sub,Mul,Sum};
-
-
指针函数
-
本质上是一个函数,返回一个指针,但不允许返回函数内部的局部变量的地址
-
定义格式: 数据类型 *函数名(参数列表) { 函数体; return 地址; }
-
-
函数指针
-
本质上是一个指针,用来指向函数的首地址,函数名表示首地址
-
格式:存储类型 数据类型 (*函数指针变量名)(参数列表)
-
char *strcat(char *dest , const char *src); char *(*q)(char *,const char *) = strcat;
-
p的类型:char * (*)(char *,const char *)
-
-
多用于回调函数
-
函数名做参数函数指针接收函数的首地址
-
-
-
字符指针数组
-
本质上是一个数组,存储多个字符指针
-
格式:char *字符指针数组变量名[常量表达式]
-
char *p[3];
-
-
字符指针数组存储多个字符数组变量的地址
-
格式 :char a[] = "123",b[] = "abc",c[] = "ABC"; char *p[3] = {a,b,c}; p[0] = a;可修改p[0];
-
-
字符指针数组存储多个字符串常量的地址
-
char *p[3] = {"123","abc","ABC"};
-
p[0] = "123";不可修改,字符串常量存放于静态区
-
-
-
-
一维字符数组和指针
-
格式: char str[] = "hello"; char *p = str;
-
字符指针指向字符数组的首地址
-
char str[128] = "hello"; //把字符串常量的复印件,赋值给str char *p = str; //指针p指向字符数组str的首地址
-
特点:可以通过指针修改数组对应的值 不同的地址指向不同的字符数组的首地址,则打印的地址不同
-
-
-
字符指针指向字符串常量的首地址
-
字符串常量存储时以字符数组形式存储在静态区
-
故而不可通过指针p修改字符串常量的首地址
-
-
char *p = "hello"
-
指针p指向字符串常量的首地址,也就是‘h’的首地址
-
-
-
-
数组指针
-
本质上一个指针,用来指向一维数组为整体的首地址,也就是二维数组的变量多用于二维数组做参数,数组指针接收二维数组地址
-
格式 存储类型 数据类型 (*数组指针变量名)[常量表达式]
-
()不可省略
-
优先级 : ( ) > [ ] > *
-
-
常量表达式
-
必须和二维数组保持一致,表示一行偏移几个元素
-
int a[2][5]: int (*p)[5] = a;
-
p的类型是int(*)[5]
-
行偏移
-
-
-
-
-
-
指针数组
-
存放指针的数组 (本质上是数组)
-
格式 : 存储类型 数据类型 *变量名 [常量表达式]
-
常量表达式:数组的长度,指针的个数
-
-
int a,b,c; int *p[5] = {&a,&b,&c};
-
p的类型是int *p[3] 占3 * 8个字节
-
-
-
-
二维数组和指针
-
int arr[][3] = {1,2,3,4,5}
-
&arr[0][0] --> arr[0] 一级地址 &arr[0] --> arr 二级地址
-
int (*p)[3] = arr;
-
arr 是二级地址,故而p进行偏移时为行偏移
-
p++;
-
arr+1
-
&arr+1
-
三级地址
-
偏移整个数组的字节大小
-
-
-
-
地址
-
&arr[i][j]
-
*(arr + i) + j
-
arr[i] + j
-
-
-
&p[i][j]
-
*(p + i) + j
-
p[i] + j
-
-
-
-
取值
-
arr[i][j]
-
*(*(arr + i) + j)
-
*(arr[i] + j)
-
-
-
p[i][j]
-
*(*(p + i) + j)
-
*(p[i] + j)
-
-
-
-
偏移
-
列偏移
-
&p[0][0]
-
p[0]
-
-
&arr[0][0]
-
arr[0]
-
-
-
行偏移
-
&p[0]
-
p
-
-
&arr[0]
-
arr
-
-
-
页偏移
-
&arr
-
偏移整个数组
-
-
-
指针
-
&p
-
偏移指针字节大小
-
-
-
-
-
-
通用类型指针
-
void *指针变量名
-
通用类型指针可以指向任意类型的地址,可以指向计算机的一片内存,但是需要类型强转,多用于传参和返回
-
-
-
多级指针
-
存储类型 数据类型 ***指针变量名
-
*的个数任意
-
二级及多级指针的数据类型均为指针,占8字节
-
-
-
-
一维数组和指针的关系
-
int arr[] = {1,2,3,4,5}
-
数组名表示数组的首地址 , 也就是第一个元素的地址
-
arr = &arr[0] int *p = arr;
-
arr为地址常量,不可对其进行赋值和自增运算
-
-
-
-
数组 相当于取容器(不同于指针)
-
水
-
一瓶水
-
一箱水
-
包含关系
-
-
-
-
-
C语言知识小结(终)指针
最新推荐文章于 2024-07-08 14:56:17 发布