1.指针的两值四方面
两值:自身的值、指向的值
四方面:
(1)指针的本质:地址
(2)指针自身类型:int *ptr, int*
(3)指针指向类型:int *ptr, int
(4)指针的大小:所占内存空间数,4字节或8字节
2.什么是地址
地址就是内存单元的编号
3.指针操作
(1)获取变量地址:对变量取地址,通过&符号
(2)指针本质:指针变量是保存指针的变量,而给p却赋值一个地址,从而推出,指针其实就是地址而已
//定义变量,本质是要开辟空间,只要开辟空间,就会有地址,而地址如何存储,就是使用指针变量
#include <stdio.h>
int main(){
int a = 10;
int *p = &a; //p是指针变量,保存了a的地址
return 0
}
(3)指针大小
int main() {
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(float*));
printf("%d\n", sizeof(double*));
return 0;
}
输出:8 8 8 8 8
(4)指针的两值
p指针变量保存了a的地址,我们就认为p指向了a
此时对于p来说,有两方面的值,一是p变量自身的值,二是*p所指向的值(也称解引用)
对*p赋值,就是修改指向的值,即修改a的值
对p赋值,比如p = &b,就是修改p指针变量自身空间的值,即让p不再指向a,而是指向b
4. 指针两值的验证 const
.c const 只读变量
.cpp c plus plus c++ const 常量
以下定义p是错误的,因为a被定义为常量,如果定义指针p指向a,那么意味着p可以实行对a的操作,这显然是不可行的
const int a = 10;
int* p = &a;
正确定义
const int a = 10;
const int* p = &a; //语法要求
int a = 10;
const int* p = &a; //语义要求
int main() {
int a = 10;
int b = 20;
const int* p = &a;
//*p = 100 //不可修改指向的值,但a可以改变值,此时p指向的值也改变
p = &b; //可以修改自身的值
return 0;
}
int main() {
int a = 10;
int b = 20;
int *const p = &a;
//p = &b //不可修改自身的值
*p = 100; //可以修改指向的值
return 0;
}
const是修饰*p(指向的值)为常量,还是p(自身的值)为常量,关键在于const是在*的左边还是右边
5.指针的两类型
自身类型
char *pc; //把名字pc去掉,剩下的char*就是pc指针变量自身的类型,即字符型指针类型
short *pc; //把名字pc去掉,剩下的short*就是pc指针变量自身的类型,即短整型指针类型
int *pc; //把名字pc去掉,剩下的int*就是pc指针变量自身的类型,即整型指针类型
double*pc; //把名字pc去掉,剩下的double*就是pc指针变量自身的类型,即浮点指针类型
注:当能定义出指针变量的时候,只需要把名字去掉,剩下的就是指针变量自身的类型
指向类型
char *pc; //把名字pc和*去掉,剩下的char就是pc指针变量自身的类型,即字符类型
short *pc; //把名字pc和*去掉,剩下的short就是pc指针变量自身的类型,即短整型类型
int *pc; //把名字pc和*去掉,剩下的int就是pc指针变量自身的类型,即整型类型
double*pc; //把名字pc和*去掉,剩下的double就是pc指针变量自身的类型,即浮点类型
注:当能定义出指针变量的时候,只需要把名字和*去掉,剩下的就是指针变量指向的类型
函数传参