首先说一下写这篇文章的原因,在学习实用算法课程期间,发现以前学习的指针相关知识还有偏差,所以在CSDN上面找了挺多相关知识,基本弄明白了怎么回事,以下三篇文章对我帮助很大:
https://blog.csdn.net/synapse7/article/details/10260339
https://blog.csdn.net/qq_21583681/article/details/78572009
https://blog.csdn.net/noob_f/article/details/48896505
https://blog.csdn.net/u011555996/article/details/79496203
https://wenku.baidu.com/view/625aaff7b7360b4c2f3f6492.html
https://blog.csdn.net/wwx2ln/article/details/79781261
首先需要明确一个基本概念:在C语言中 * 与 & 这两个符号在不同情况下所表达的含义是不一样的
一、首先我们要对一些潜在的计算机只是有一定的了解:(或许这就是吃虫子和吃饲料的区别吧,这里有篇B站说的挺有道理与大家共勉https://www.bilibili.com/video/av30153849)
我们再定义一个变量 a 时,变量 a 本质上代表一个存储单元,CPU通过该存储单元的地址访问该存储单元中的数据。所以a本来代表两个值:存储单元的地址和储单元中的数据。于是就有了二异性。为了消除这种二义性,C语言规定a表示存储单元中的数据,&a表示存储单元的地址。a存储单元中的数据可以是一个普通数值,也可以是另一个存储单元的地址,比如:a = &b; 语句就是将b的存储单元的地址存入a存储单元中。
在C语言中 * 和 & 两个符号在不同情况下的含义是不一样的
1.指针的定义和初始化
(1)&a: 取地址符(单目运算符):在此时,&的含义是去变量a的地址
a&b: 按位与(双目运算符):在此时 & 是一个单目运算符
*的三种用法:
(1) 乘法:3*4=12:这种情况是作为算术运算符出现
(2) int *p=&a; //定义指针变量:此时为初始化指针变量,int *p定义了一个指向int类型指针p(我们使用*符号把p声明为指针),并初 始化p使其指向int类型的变量a,这里&num中的&是取地址操作符,当&作用于一个对象上时,它返 回了该对象的地址,
(3) *p //解引用 :在这里 * 的作用是解引用(这里解引用的意思可不太好理解,正确的说法应该是 *运算符给出指针变量p中 存储的地址上存储的值(或者说是给出指针p指向的地址上存储的值))由于在C语言中所有的变量都需要先定义声明后使用, 要求p对应的存储单元中的数据一定是另一个存储单元的地址,于是,*a表示另一个存储单元中的数据。
(这里*操作符为解引用操作符,它返回指针p所指的对象(左值)。
我们可以对*p赋值(对左值赋值),从而改变p所指的地址上所保存的值)
(2)int *p=&a; //定义整型指针变量(p)保存整型地址值
*p=100; //间接访问符(解引用)通过p间接访问变量a的值并把a的值赋为100
(3)int v2=0,*q=&v2; 等价于 int v2=0,*q; q=&v2;
关于“指针”和“指针变量”比较严格的说法是这样的:
系统为每一个内存单元分配一个地址值,C/C++把这个地址值称为“指针”。如有int i=5;,存放变量i的内存单元的编号(地址)&i被称为指针。
“指针变量”则是存放前述“地址值”的变量,也可以表述为,“指针变量”是存放变量所占内存空间“首地址”的变量(因为一个变量通常要占用连续的多个字节空间)。比如在int i=5;后有一句int *p=&i;,就把i的指针&i赋给了int *型指针变量p,也就是说p中存入着&i。所以说指针变量是存放指针的变量。
有一个事实值得注意,那就是有不少资料和教科书并没有如上区分,而是认为“指针是指针变量的简称”,如对int *p=&i;的解释是:声明一个int *型指针p,并用变量i的地址初始化;而严格说应该是声明一个int *型指针变量p才对。所以有时看书要根据上下文理解实质,而不能过于拘泥于文字表述。
https://blog.csdn.net/u014774853/article/details/52877655 char** p指针的指针意思详解
https://blog.csdn.net/txj236/article/details/52325723 https://blog.csdn.net/wofreeo/article/details/80604917 解引用的通俗解释
理解不对的地方还请各位不吝指出,我会一一回复的