前言
学习不复习,不如不学习,
写指针的时候有些概念模糊了,故梳理复习一下指针。
1、什么是指针?
1.1、指针就是地址,特点是任意类型的指针以整数类型存储,也就是占用4个字节
验证代码:
printf("%d\t%d\t%d\t%d\t\n", sizeof(int *), sizeof(double *), sizeof(char *), sizeof(float *));
int *p = NULL;
char *pp = NULL;
double *ppp = NULL;
printf("sizeof(int *p)=%d\n", sizeof(p));
printf("sizeof(char *pp)=%d\n", sizeof(pp));
printf("sizeof(double *ppp)=%d\n", sizeof(ppp));
打印结果:
注:x64平台可能是8个字节
1.2、存放指针的变量称为指针变量
- 1.2.1 如何定义指针?
答:类型 *变量名。
如上图int *p;char *pp;等
- 1.2.2 如何打印指针变量?
答:以%d或者%p的形式去打印
(整数打印或十六进制打印(地址专用))
- 1.2.3 如何对指针变量初始化?
答:
1、用 NULL初始化:int *p=NULL;
2、用变量的地址直接进行初始化,初始化后指针可以充当变量的使用:
`int a=1; int *p=&a; `此时输出*p就是输出a的值,*p等价a,打印 *p结果为1。
解释:指针就好比是一个可以去任意地方的传送门。你想回家装修,那你得先把你家地址输进去(取地址符),使用传送门就可以到家里了。
附上验证代码:
int a = 1;
int *p = &a;
printf("%d\t%p\t\n", p, p);//两种方法打印
//printf("%d\t%d\t\n",*p, a);//指针充当变量的使用
打印地址结果:
1.2.4 所有指针都可以用NULL初始化,但不可以操作或修改NULL地址,初始化用NULL表示指针不指向任何的对象。
经典错误1:
int *p=NULL;
*p=1;(×)//指针不指向任何对象,不可以访问值
//error:写入位置 0x00000000 时发生访问冲突。
正确写法:
int *p=NULL;
int a=0;
p=&a;//指针修改指向,指向了变量a的地址,从而可以访问a的值
*p=1;
代码验证:
经典错误2:
int *p;
*p=1;(×)
//error C4700: 使用了未初始化的局部变量“p”
注: 没有指向的指针称为野指针。错误2中p没有给分配内存,内存分配有三种方式:malloc,calloc,realloc,后面会详细说一下其区别.
2、指针易错易混淆的地方:
2.1 指针的两个类型
int *p;
2.1.1 指针的类型 去掉变量名。
int *p中的 int *:指针的类型
2.1.2 指针所指向的类型:对应内存当中存储的数据类型 : 去掉变量名和*
int *p中int:指针所指向的类型
2.2 指针的两个原则
2.2.1 和变量一样,使用前必须初始化原则
2.2.2 类型一致原则: 指针的类型和指针的所指向的类型的一致性
错误写法:
char a = 'A';
int *p = &a ;(×)//类型不兼容
2.3 指针的两个运算
2.3.1 取值运算
&:取地址符 &变量名:&a --->取变量的地址
*: 解引用符 *指针变量 :*p ---->指针变量存储的地址 对应内存中的值
2.3.2 指针的加减运算 : 用于数组
目的:为了操作一段连续内存,可以简化代码:
No.1 不同类型的指针内存占用情况
No.2p+n操作?
实际上是: p+(sizeof(指针所指向的类型)*n)
减法同理:p-n //p-(sizeof(指针所指向的类型)*n)
代码验证如下:
未完待续-------->
预告:一级指针和一维数组;
多级指针操作多维数组;
指针对字符或字符串的操作;
对void *的理解;
一些指针的妙用。