指针是C语言中一个非常强大但也相对复杂的概念,理解指针对于掌握C语言至关重要。他的作用非常强大:
1. 指针让C语言程序更加简洁、高效
2. C指针可以直接操作内存
指针基础
基本概念
地址
内存中用来区分不同字节的编号,64位操作系统 8个字节表示地址
指针
指针就是地址,地址就是指针,指针指向某个地址对应的内存空间
指针变量
是一个变量,变量用来存放内存地址,使用变量,便是使用该地址,所以指针变量有时也简称为指针
运算符
&:获得变量在内存中的首地址(取地址符号)
int a = 0;
&a;
表达式的值:变量在内存空间中的首地址
表达式的类型:int *,&有类型升级的效果
* :
*p = 100; //将100赋值到p指向的空间中
a = *p; //使用p指向空间中的值赋值给a
左值:将右值放入指针指向的空间
右值:取指针指向空间中的值
指针变量的定义:
所有的指针变量在64位操作系统中均为8个字节
数据类型 *变量名;
int *p;
int *p, *q;
char *p;
double *p;
指针变量的初始化:
1. 野指针:
未初始化的指针,指向随机空间。
指向已经被释放空间的指针。
2. 空指针:
NULL,内存中为0值,指向内存地址为0x0空间的指针。
0x0地址空间不能读写,如果读写会产生段错误(操作非法内存空间)。
内存访问两种形式
通过变量名访问(直接访问)
int a;
int b;
a;
b;
通过变量在内存中的地址访问(间接访问)
int a;
int *p = NULL;
p = &a;
*p = 100;
指针的算数运算
+ – ++ —
int *p:偏移量为4字节
double *p:偏移量为8字节
char *p:偏移量为1字节
p++:指针向内存高地址偏移指向数据类型大小个字节空间
p–:指针向内存低地址偏移指向数据类型大小个字节空间
指针作为函数传参
1.传值:
函数体内想使用函数体外部变量值的时候传值
2. 传地址:
函数体内想修改函数体外部变量值的时候传地址
3.数组传参
int a[5] = {1, 2, 3, 4, 5};
int fun(int array[5]);
int fun(int array[], int len);
int fun(int *parray, int len);
指针和数组的关系
数组是用来存放一组数据的
指针是用来操作数据的
指针和一维数组的关系
int a[5] = {1, 2, 3, 4, 5};
int *p = NULL;
p = a;
a == &a[0]
数组下标为n的元素访问:
a[n] == *(a+n) == *(p+n) == p[n]
一维数组的数组名是指向数组第一个元素的指针常量
C语言中[ ]表示让指针加上某个偏移量再取*
p[n] == *(p+n)
指针是C语言的核心特性,它提供了直接操作内存的能力,使得C语言非常灵活和强大,能够实现高效的内存管理和复杂的数据结构。掌握指针需要理解内存地址的概念,熟练运用取地址 & 和解引用 * 操作符,并时刻注意指针的安全使用以避免常见的错误




