❶ c語言 指針運算符,地址運算符是怎樣工作的
我把「*」和「&」這兩個運算符做了較詳細解釋。這段代碼你可以拷貝到VC/VS工程中看,我不知道你學過計算機硬體知識沒,如果你學過硬體的一些基礎知識,就比較容易理解。不過沒學過也可以理解。如果你不明白就再問
int main()
{
int arr1 = 12, arr2 = 15;
char ch1 = 'b', ch2 = 'h';
float f1 = 3.14, f2 = 3.15;
/* 「*」地址運算符解釋 */
/* 定義三個指針,這三個指針分別指向不同的數據類型 */
/* 注意:此處的「*」指針運算符是為了說明我們定義的變數是一個指針變數 */
int *p_arr = &arr1; //指針變數p_arr中存放的是arr1的地址
char *p_ch = &ch1 ; //指針變數p_ch中存放的是ch1的地址
float *p_f = &f1 ; //指針變數p_f中存放的是f1的地址
/* 注意:此處的「*」指針運算符是為了操作指針p_arr指向的元素 */
*(p_arr) = 30; //等價於把變數arr1賦值為30
*(p_ch) = 'c'; //等價於把變數ch1賦值為字元'c'
*(p_f) = 90.89; //等價於把變數f1賦值為浮點數90.89
/* 「&」地址運算符解釋 */
p_arr = &arr2; //把變數arr2的地址賦值給p_arr
p_ch = &ch2; //把變數ch2的地址賦值給p_ch
p_f = &f2; //把變數f2的地址賦值給p_f
return 0;
}
❷ c語言中指針就是地址,那&運算符也是地址,這話說的對嗎
對!
嚴格說起來,應該這么講:指針存的是地址,而&運算符是取變數的地址。
指針原理是這樣的:其實計算機中的內存就像一個個抽屜(一兆內存就相當於1百萬個抽屜),每個抽屜都有一個編號,用於存放數據。
為了方便使用,編譯器允許我們在寫程序的時候,對抽屜進行命名(而不是使用抽屜的編號),這就是變數名。就比如說我們在程序中定義:char C; 這個時候系統會幫我們找一個空閑的抽屜(比方說編號為981的抽屜),命名為C,用於存放一個字元變數。以後我們在程序里只要使用C這個變數,系統就知道是要對981這個抽屜里的數據進行操作。
而指針是什麼呢?指針是我們申請一個空抽屜,裡面不放數據,而放編號。比如我們申請一個字元指針:char *ch=&C; 這個時候,ch裡面放的是C這個變數的地址(也就是981),其中&是取址符,也就是取C這個變數的地址,而不是值。*ch才是ch指向的值。
❸ c語言中,指針和取地址運算符到底是什麼啊,能不能通俗一點講啊,謝謝
關於指針,統統都是在說內存的事情,內存就像一個大樓,每個格子都有一個門牌號,也就是地址。取地址符的作用就是得到內存中某一段內容的門牌號,以供後面的需要。指針就是通過一個門牌號找到這個內容,跟取地址是一對
❹ c語言中 「*」運算符的作用是 所謂「指針」就是
用作乘法,為百雙目運算符,形式為a*b, 就是計算數學中的度a乘以b。用作取值運算,為單目運知算符,根據後續操作數(必須為指針)類型,取其指向的值。道
所謂的指針,本質上就是地址。 指針變數的值,就是地址的值,當取值運算時內就是到對應的內存地址上,依照指針類型進容行取值。
運算所需變數為一個的運算符叫單目運算符,例如【!,~,()】 。
運算所需變數為三個的運算符叫三目運算符:【?:】
(4)c語言地址操作符指針擴展閱讀:
雙目運算符
初等運算符下標運算符【[]】、分量運算符的指向結構體成員運算符【->】、結構體成員運算符【.】
算術運算符
乘法運算符【*】、除法運算符【/】、取余運算符【%】 、加法運算符【+】、減法運算符【-】
關系運算符
等於運算符【==】、不等於運算符【!=】 、關系運算符【< > <= >= 】
邏輯運算符
邏輯與運算符【&&】 、邏輯或運算符【||】
❺ 怎麼理解C語言里的指針
指針就是內存的地址。
內存懂吧,就是放數據的地方,數據就像一個人的家,懂吧,一棟樓里,肯定住了不止一家人吧,那麼確定每家的地址,就需要幾樓幾零幾這樣設置地址吧。內存也是一樣的,內存是按一個位元組的大小來安排地址的。
比如int a;我們申請了一個int型,整形的變數,int是四個位元組的數據類型,所以變數a在內存上會有一個地址,地址是按第一個數字為準的。假設內存上沒有任何數據,都是空的,那麼內存就會按順序來放地址,假設內存的第一個地址是0,以此類推,那麼當我們int a變數的時候,內存就會把0-3地址的空間分配給變數a,因為a佔四個單元內存,那麼怎麼確定變數a的地址呢?計算機是按這個內存地址上的最開始那個算的,即變數a的地址是0。
當我們在聲明了int a變數之後,再聲明一個char b變數。如下:
int a;
char b;
這個時候,int a先被聲明了,假設內存是空的,那麼變數a就會被安排0-3的地址。第二個聲明char b;就會接在變數a之後,因為char是一個位元組的數據,所以內存只會分配一個4號內存給變數b,變數b的地址就是4。以此類推,其他類型是一樣的。
指針就是用來存放內存地址的地方。指針變數一般也會單獨存放。
比如:
int a; //內存分配編號為0-3的內存空間給變數a;變數a的地址就是最開頭的那個編號即變數a的地址是0;
char b; //內存緊接著分配編號為4的內存空間給變數b,因為char是一個位元組的,所以變數b的地址唯一,就是4。
隨後,我們申請指針。
int * p;
char * t;
我們申請了兩個指針, *是指針的標志,有*的變數是指針,沒有*的是一般變數,*只是用來區別變數是int型數據還是指針。
當變數是指針的時候,意味著這個變數只能存放內存地址,而不能存放任何自然數。
即指針p,只能用p=&a; 變數a在C語言中,單用的時候,使用變數a裡面存放的值,而不是他的地址,比如 我們再聲明一個變數 int g; g=a;這個例子里,我們聲明了一個int型變數g,並用g=a來初始化g,g=a的意思是,用a里存放的數,即讀取出a裡面存的數,然後把這個數給g,並不是把a的地址給g。所以C語言里規定了符號&為取地址操作符,p=&a;的意思就是取出a的地址,給p,這個時候是可以的,因為p是指針,並且p指針指向的類型是int。
在C語言中,給指針賦地址,要檢查變數的類型的,比如int *p;這個指針p,p前面的*表示他是指針,說明他只能存放地址,*號前面的類型說明符,進一步說明,p這個指針只能存int型變數的地址,即如果p=&b;是不會成立的,並且會報錯,因為p是一個存放int型變數的指針,而變數b是一個char型變數,在C語言里,指針和對應的變數的類型要一致。不能夠混用。
不能混用的原因在於,到時候解引用的時候會出錯,即如果 p=&b,成立的話,那麼到時候使用 a=*p;的時候會出現嚴重錯誤,因為p=&b,是把char型變數的地址給int型指針,當我們在使用解引用符號*的時候,就會錯誤,a=*p;的意思是,用p里存放的地址,找到內存上的數據,並且給變數a,編譯器會檢查,得知p是int型變數指針,所以需要按照這個地址取出的數據是四個位元組的數據,所以程序會把b的地址4按照int型的數據變數地址來使用,會調取內存上編號為4,5,6,7號位的數據,然而編號為4的內存上放的是char 型變數b的數據,5,6,7號內存上,根本沒有數據,從而出錯。所以C語言嚴格要求,指針的類型和變數類型要一致,即int *的指針只能存放int型變數的地址,不可混用。
最後一個疑問點在於*符號,在C語言里是復用的,即有三種使用方法,這里給你區別一樣,要不然你會有疑問,* 這個符號,在C語言有三種意思,一種是乘法,即 a=5*3里,這個時候這個符號*是乘法的意思,認出他很簡單,因為乘法必須要有乘數,被乘數,即符號*左右兩邊都要有實數或者變數,即使是c=a*b;的表達也不會錯,a,b是變數的話,符號*是乘號用法。
第二種用法就是我們看到的 int *p;這裡面符號*是指針的標志,只是用來說明p是一個指針,假設一個int p,那請問怎麼區別p是指針還是變數,所以就是通過添加符號*來區別變數和指針的,而且指針和變數一樣,都需要int,char,double等類型說明,所以只有在聲明變數的時候,才使用。
第三中用法就是和符號&的操作相反的操作,符號&在C語言里,只有一個用法,就是表明,這個運算符是取出後面的地址,即&a,就是取出變數a的地址,即指針,符號&左邊沒有任何變數,只有右邊有變數,而符號*則是相反操作,意思是取出符號*右邊的指針里的地址,並取出這個地址里存放的數,所以*P,就是取出指針p里的地址,然後取出這個地址里存放的數。符號*也是右邊有變數,而左邊沒有任何變數的操作,他們都是單操作符。
第二種和第三種用法要怎麼區別,就是第三種一定是a=*p這樣使用的,符號*的左邊一定沒有任何類型說明符,而如果是第二種用法,那麼符號*的左邊一定有類型說明符,即第二種一定是int *p; 即 類型說明符 + * +變數名的形式,而且只用在聲明指針變數的時候。
❻ C語言中如何用指針運算符來表示一個二維數組的元素及地址
二維指針,就是說第一維是指針,第二維還是指針;
拿*(*(a+i)+j)來說:a是數組的首地址吧,然後+i,就是說a地址向後偏移i位。就是a+i的地址了,注意,這里a+i只是地址,用*符號取出該地址的數據,就是*(a+i),這里*(a+i)就是第一維指針,它指的是地址,不是數據。
而且後面的*(a+i)+j就是說以*(a+i)為首地址,偏移j位,然後使用*取內容,這里就是第二維了,取到的數據就是實際數據了
❼ C語言中地址操作符、指針操作符分別是什麼
&是地址操作符。
e.g.
int a;
int *b;
b = &a; //&就是取a的地址,即是地址操作。
*是指針操作符,可以聲明指針,也可操作指針所指的數據;
int *p;
*p = 10;
❽ c語言指針地址的全部表示方法
朋友那本書對指針還真的沒解釋多少.請看下面這個例子,看了你也應該會明白了float f = 1.1; // 定義一個<float>型的變數f,f的值為1.1;float* p = &f; // 定義一個<float * >類型的變數 p,值為&f(也就是變數f的在內存中的地址). 注意:指針也是一個變數,只是指針有點特殊,因為它只存儲地址,(簡單的說,指針就是一個用來存放地址的變數,)如果不懂,就繼續追問.這一步你必須清楚了.*p = 3.3; // 將3.3的值付給p指向的變數.(*操作符又稱作為間接值(indirect value) 或者解除引用(dereferencing)操作符.)float * p2 = p; // 定義一個指針p2讓p2指向變數f.(請記住p就是一個存放地址的變數,就像普通變數一樣,這條語句就是將p中存放的地址賦給p2);*p2 = *p; // 先取p指向的變數(解除引用),再取p2指向的變數(解除引用),最後將p指向的變數付給p2指向的變數,(其實這里沒有任何意義,因為他們都指向變數f.這條語句相當於 f = f;)float** temp = &p; //如果對&p取地址,那麼就應該用一個二級指針(**)來指向它,不然就沒有任何意義. (個人認為)指針的主要用途還是體現在傳遞大的數據類型方面(還有一點就是他可以通過地址(指針),來改變變數的值).例如,一個很大的數組,或者一個很大的結構體,int value1[1000];typedef struct { int value2; float value3; char value4[100]; ........} test test astTest[50];千萬不要以為這只是特殊的時候.其實這類復合型的數據是很常見的. 當某個函數需要調用他們時,如果直接傳值調用的話...int function( int value1[1000], test astTest[50] );光是將原參數的值賦給函數的參數,就會浪費很多的內存,如果一個工程全是這樣的函數,那麼...很難想像.而且value1 和 astTestt的值還不會因為這個函數而改變..(不信可以試試,想要改變的話,還得將數組或作為返回值傳遞回來.). 但是如果用指針作為參數的話..int function2( int * value, test * astTest );這樣就什麼問題都OK了.慢慢體會一下...
❾ c語言中取地址符和*有什麼區別
區別如下:
(1)兩者根本意義不同。*是指針的意思,而&是去地址的意思,這兩個相輔相成。
(2)用法不同。高級的c語言都是動態開辟內存,是使用malloc和free,這時就不用&了,因為取引用都是對於棧上的數據,在數據結構中,都是在堆上開辟數據容量。
(3)語言規則不同,變數類型加*就是一個指向該變數類型的指針,通俗點說,指針就是可以通過地址修改和獲取該變數的值,而&符號只是獲取該變數的地址!
指針中的「取地址符」
(9)c語言地址操作符指針擴展閱讀:
引用的聲明符放置在變數名的前面,和*操作符的用法一樣。
引用聲明完畢後,相當於目標變數名有兩個名稱,即該目標原名稱和引用名,且不能再把該引用名作為其他變數名的別名。ra=1; 等價於 a=1;
聲明一個引用,不是新定義了一個變數,它只表示該引用名是目標變數名的一個別名,它本身不是一種數據類型,因此引用本身不佔存儲單元,系統也不給引用分配存儲單元。
故:對引用求地址,就是對目標變數求地址。&ra與&a相等。
#include<iostream>using namespace std;int main()
{ int m[10]={1,2,3,4,5,6,7,8,9,10}; int (&n)[10]=m; for(int i=0;i<10;i++) cout<<m[i]<<' ' ;
cout<<endl; for( i=0;i<10;i++) cout<<n[i]<<' ' ; cout<<endl; return 0;}
例如:
int*pointer;//建立一個指針
int*&p1=pointer;/*
正確,編譯系統把"int*"看成一體,把"&p1"看成一體,即建立指針pointer的引用,就是給指針pointer起別名p1。
int&*p2=pointer;//錯誤,這就變成了引用的指針。