首先需要明確一個基本概念:在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 解引用的通俗解釋
---------------------
作者:一眼十年ing
來源:CSDN
原文:https://blog.csdn.net/qq_26606969/article/details/82872693
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!