C/C++中的指针(笔记)-指针基础知识总结

 1、指针概述

2、指针和指针变量

内存区的每一个字节都有一个编号,就是“地址”

如果在程序中定义了一个变量,在对程序进行编译或者运行时,系统会给这个变量分配内存单元,并确定他的内存地址(编号)

指针的实质就是内存地址,指针就是地址,地址就是指针

通常我们叙述时会把指针变量简称为指针,实际他们的含义不一样

3、指针的定义和使用

//1指针也是一种数据类型

//p 是一个变量,p的类型是int*

int * p ;
p = (int*)123;
printf("%d
",(int)p)

// 指针指向谁,就把谁的地址赋值给指针

int a = 10;
p = &a;
printf("%p,%p
",p,&a);

// 直接操作指针变量本身没有意义

// 需要操作*p ,操作指针所指向的内存

*p = 100 //*p 相当于a

见图理解:

4、指针变量和指针所指向内存的区别

//*有两层含义

定义变量时 ,*代表的是类型  ,它是指针类型int *

在使用变量时,*代表操作指针所指向的内存

5、野指针

野指针就是保存没有意义地址的指针变量

 

6、空指针

//防止随便用指针

//空指针,给指针变量赋值为Null

//Null就是数字0

7、指针大小

//32位编译器用32位大小(4字节)保存地址

//64位编译器用64位大小(8字节)保存地址

 8、多级指针

//如何定义一个合适类型的变量,保存另一个变量的地址

//在需要保存变量地址的类型基础上加一个*

 

9、[ ] 不是数组的专属

内存就是一个大数组,指针可以用[ ]

10、万能指针

首先不能定义void的普通类型 void a    ---报error(因为内存不知道要分配多少空间给a);

可以定义void * 因为只有两种情况,一种是32位的,一种是64位的,可以分配固定空间

万能指针:void *  =void *******可以指向任何类型的变量,使用指针所指向的内存时,最好转换它本身的指针类型

例子:

void *p = Null;
int a = 10;
p =&a;  注意这里保存的是a的首地址

*p = 222;  这里会报错 ,因为*p不能确定给它多少内存空间,如果是int *那么是给4个字节/char*是给一个字节,
但是void*,不能确定是给多少个字节,
&a只是保存的是首地址,不能确定位数就不能确定尾地址要转换为
* ( (int*) p ) = 222; //不做类型转换就无法确定步长,就无法确定操作多长的内存

11、指针步长

//1指针的加法不是传统的加法,

//2步长由指针指向的数据类型决定

int a;
int *p = &a;
printf(“p: %d,p=1;%d
”,p,p+1);

// p:1637816   ,p+1:1637820   说明int占4个字节

char b;
int *q= &b;
printf(“q: %d,q=1;%d
”,q,q+1);

// q:1637795  ,q+1:1637796   char占一个字节

12、const修饰的指针变量

 //指针变量的含义

//指针所指向的空间

int a =10;
int *p1 = &a;
*p1 = 100;// 等价于操作a, *p1操作指针所指向的空间
p1 = Null; //操作指针变量

// const 修饰*,代表指针所指向的内存是只读的
const int *p2 = &a; 
*P2 = 100; //这里会报错,因为*p2已变为只读
p2 = Null;//这里操作的是指针变量
//上面的等价于(看const的位置):
int const *p3 = &a;
*p3 = 100;//也会报错


//const 修饰指针变量,代表指针变量的值为只读
int * const p4 = &a;
*p4 = 100;//OK
p4 = Null;//err

const int * const p4 = &a;//都不能改,全是只读
原文地址:https://www.cnblogs.com/Robertzewen/p/10469003.html