目录
指针
翻译pointer --- 指向,通常用箭头表示
C语言特有的数据类型,只有C/C++才有指针;
容易出现段错误----本质上是野指针,就是未申请但是直接使用的内存
从0X00000000到0XFFFFFFFF---地址常量,保存这个数据类型的变量叫指针
定义:保存地址常量的变量叫指针,本质是变量
32位4G虚拟内存图
kernel区和文本区指针可以指向,但是不能使用,野指针有可能指向
静态常量区都是在程序编译时申请内存,初始值默认为0,程序结束时释放常量;
栈区从上向下访问,堆区从下向上;
堆区申请malloc函数,释放free,头文件stdlib.h,标准lib库,
void *任意类型的指针,一般放在函数头,函数类型
1.指针定义格式:
存储类型 数据类型 *变量名;
char *pc 定义一个字符型指针
int *px 定义一个整型的指针
double *pd 定义一个实型的指针
pc px pd 称为指针,char *,int *, double *为指针类型
2.指针初始化:
不初始化
Int *px;//野指针
默认初始化
使用变量初始化
使用其他指针初始化
使用绝对地址初始化
Int *py=(int *)0x1235678;使用一个绝对地址初始化,不能访问
nil=0x0,NULL=0x0,
#define NULL ((void *)0x0)
3.指针相关符号
* -- 取值运算符 需要与int *、char *区分,这是数据类型,
& --取地址运算符
int *px=&x, x=100;
*px=100
c语言中没有int &符号,c++有(引用,类似指针使用,比指针更安全);
同时存在时从右向左算,
32位操作系统一个指针4个字节,64位系统指针是8个字节。
做题一般以32位操作系统做,除非特殊说明按照说明,但是现在电脑是64位
指针可以px++;加的是单位,看数据类型,char则地址加1,int加4
4.指针运算
算术运算
+ - ++ -- 两个指针之间可以相减,不能直接相加 优先级后置++ > * = 前置++
int a=0,*i; i=&a; printf("%p",i) *i++; printf("%d",a); printf("%p",i);
假设i=0x11111111,a=0,i=0x11111115
int a=0,*i; i=&a; ++*i; printf("%d",a); printf("%p",i);
i=0x11111111,a=1,i=0x11111111
指针在相加时,加的是单位个数,意味着向后挪多少个单位个数
比较运算
就是两个16进制数字的比较
> >= < <= == !=
指针之间的比较为两个十六进制数字的比较
一般主要用于指针与NULL的比较
if(pn == NULL)
if(pn = NULL)
if(NULL == pn)
if(NULL = pn) //错
5.指针进阶
一维数组等价关系
数组指针
如果一个指针指向一个数组,则满足等价关系:
num【i】==pnum【i】==*(num+i)==*(pnum+i)
【】不是数组特有的符号,只要地址连续都可以访问
不等价关系:
数组名是常量,指针名是变量,意味着数组名不能赋值,不能++;指针名可以赋值,可以++;
二维
指针数组---char *str【32】
数组指针--char (*ps)【32】
指针数组存在等价关系:
s[i][j]==ps[i][j]==*(*(ps+i)+j)==(*(ps+i))[j]==*(ps[i]+j)-----pn可以和num互换
不等价关系:
数组名是常量,指针名是变量,意味着数组名不能赋值,不能++;指针名可以赋值,可以++