c語言指針運算符的
A. c語言 指針運算符和指針說明符有什麼區別
指針運算符和指針說明符 外形上一樣昌嘩蠢,都是 * 號, 一個用在 語句里,一個用在聲明裡。
例如:
int *p; 聲明 p 是指針,它可用來指向一個 整形變數。
int (*pf)(); 聲明pf是一個指向函數入口的指針變數,該函數的返回值(函數值)是整型。耐陪
int *ap(int x,int y){...} 聲明 函數 ap, 有2個形參,函數調用會返回 一個指針,用來指向一個 整形變數。
指針運算符,也在其操作數的左邊,該操作數是一地址,用*可取得該地址處存儲的變數的值,可做右值,也可做左值。例如:
int myAge;
int *p; //指針說明符
*(&myAge)=24; // 指針運算符,&myAge 是地址,* 是取那個地址里的值的運算,做左值
printf("%d",myAge);
p=&myAge;
printf(" %d",*p+1); //指針運算符, 輸出 指針指向的變數的值加1,蘆判做右值。
輸出 24 25
B. C語言的指針運算符號
*稱為指針運算符(單目運算符),也稱取內容運算符。是用來表示指針變數和它所指向的變數直接的聯系。如果已經定義i_pointer為指針變數,則(*i_pointer)是i_pointer所指向的變數。其實*i_pointer也是一個變數,它和變數i是同一回事。下面兩個語句作用相同。 1、i=3; 2、*i_pointer=3; 第二個語句的含義是將3賦給指針變數i_pointer所指向的變數。 取地址運算符&,可以取得變數在內存中的地址。例如: pointer_1=&a; 表示把變數a的地址賦給pointer_1 * (*(a+1)+j)表示1行j列元素a[1][j]的值。 *(a+1)+j表示1行2列元素a[1][j]的地址。 這個沒有為什麼,就是規定的吧!
C. C語言中指針的用法介紹(2)
如果上例中,ptr是被減去5,那麼處理過程大同小異,只不過ptr的值是被減去5乘 sizeof(int),新的ptr指向的地址將比原來的ptr所指向的地址向低地址方向移動了20個位元組。
總結一下,一個指針ptrold加上一個整數 n後,結果是一個新的指針ptrnew,
ptrnew的類型和ptrold的類型相同,ptrnew所指向的類型和ptrold所指向的類型也相同。ptrnew的值將比ptrold的值增加了 n乘sizeof(ptrold所指向的類型)個位元組。就是說,ptrnew所指向的內存區將比ptrold所指向的內存區向高地址方向移動了 n乘 sizeof(ptrold所指向的類型)個位元組。
一個指針ptrold減去一個整數 n後,結果是一個新的指針ptrnew,ptrnew的類型和ptrold的類型相同,ptrnew所指向的類型和ptrold所指向的類型也相同。ptrnew的值將比ptrold的值減少了 n乘 sizeof(ptrold所指向的類型)個位元組,就是說, ptrnew所指向的內存區將比ptrold所指向的內存區向低地址方向移動了n乘sizeof(ptrold所指向的類型)個位元組。
第三章。運算?amp;和*
這里&是取地址運算符,*是...書上叫做"間接運算符"。
&a的運算結果是一個指針,指針的類型是 a的類型加個*,指針所指向的類型是a的類型,指針所指向的地址嘛,那就是a 的地址。*p的運算結果就五花八門了。總之*p的結果是p所指向的東西,這個東西有這些特點:它的類型是p指向的類型,它所佔用的地址是p所指向的地址。
例五:
int a=12;
int b;
int *p;
int **ptr;
Generated by Foxit PDF Creator ? Foxit Software
http://www.foxitsoftware.com For evaluation only.p=&a;//&a的結果是一個指針,類型是 int*,指向的類型是 int,指向的地址是a的地址。*p=24;//*p的結果,在這里它的類型是 int,它所佔用的地址是p所指向的地址,顯然,*p就是變數a。ptr=&p;//&p的結果是個指針,該指針的類型是p的類型加個*,在這里是 int**。該指針所指向的類型是p的類型,這里是 int*。該指針所指向的地址就是指針p自己的地址。
*ptr=&b;//*ptr是個指針,&b的結果也是個指針,且這兩個指針的類型和所指向的類型是一樣的,所以用&b來給*ptr賦值就是毫無問題的了。**ptr=34;//*ptr的結果是ptr所指向的東西,在這里是一個指針,對這個指
針再做一次*運算,結果就是一個 int 類型的變數。
第四章。指針表達式。
一個表達式的最後結果如果是一個指針,那麼這個表達式就叫指針表達式。
下面是一些指針表達式的例子:
例六:
int a,b;
int array[10];
int *pa;
pa=&a;//&a是一個指針表達式。
int **ptr=&pa;//&pa也是一個指針表達式。
*ptr=&b;//*ptr和&b都是指針表達式。
pa=array;
pa++;//這也是指針表達式。
例七:
char *arr[20];
char **parr=arr;//如果把arr 看作指針的話,arr 也是指針表達式
char *str;
str=*parr;//*parr 是指針表達式
str=*(parr+1);//*(parr+1)是指針表達式
str=*(parr+2);//*(parr+2)是指針表達式
由於指針表達式的結果是一個指針,所以指針表達式也具有指針所具有的四個要素:指針的類型,指針所指向的類型,指針指向的內存區,指針自身占據的內存。
好了,當一個指針表達式的結果指針已經明確地具有了指針自身占據的內存的話,這個指針表達式就是一個左值,否則就不是一個左值。
在例七中,&a不是一個左值,因為它還沒有占據明確的內存。*ptr是一個左值,因為*ptr 這個指針已經占據了內存,其實*ptr 就是指針 pa,既然 pa 已經在內存中有了自己的位置,那麼*ptr當然也有了自己的位置。
第五章。數組和指針的關系
Generated by Foxit PDF Creator ? Foxit Software
http://www.foxitsoftware.com For evaluation only.如果對聲明數組的語句不太明白的話,請參閱我前段時間貼出的文?lt;<如何理解c 和c++的復雜類型聲明>>。數組的數組名其實可以看作一個指針。看下例:
例八:
int array[10]={0,1,2,3,4,5,6,7,8,9},value;
...
...
value=array[0];//也可寫成:value=*array;
value=array[3];//也可寫成:value=*(array+3);
value=array[4];//也可寫成:value=*(array+4);
上例中,一般而言數組名array代表數組本身,類型是 int [10],但如果把array看做指針的話,它指向數組的第 0個單元,類型是 int *,所指向的類型是數組單元的類型即 int。因此*array等於 0 就一點也不奇怪了。同理,array+3 是一個指向數組第3個單元的指針,所以*(array+3)等於3。其它依此類推。
例九:
例九:
char *str[3]={
"Hello,this is a sample!",
"Hi,good morning.",
"Hello world"
};
char s[80];
strcpy(s,str[0]);//也可寫成strcpy(s,*str);
strcpy(s,str[1]);//也可寫成strcpy(s,*(str+1));
strcpy(s,str[2]);//也可寫成strcpy(s,*(str+2));
上例中,str是一個三單元的數組,該數組的每個單元都是一個指針,這些指針各指向一個字元串。把指針數組名 str 當作一個指針的話,它指向數組的第 0號單元,它的類型是char**,它指向的類型是char *。
*str也是一個指針,它的類型是char*,它所指向的類型是char,它指向的地址是字元串"Hello,this is a sample!"的第一個字元的地址,即’H’的地址。
D. 在c語言的指針運算中*(p+1)與p+1有什麼區別 p是指針
*(p+1)表示具體的數值,指針p所指向的內存地址單元的下一個內存地址單元中的值;
p+1
表示地址,指針p所指向的內存地址的下一個內存地址。
可以通過下面的實例來理解*(p+1)與p+1之間的區別:
int *p; // 定義一個int類型的指針p
int a[3]={1,2,3}; // 定義一個int類型的數組a,並進行初始化
p = a; // 使指針p指向數組a的首地址
printf("%d", *(p+1)); // 輸出2,等價於a[1]
printf("%x", p+1); // 以16進制形式輸出a[1]的地址(如08ff12),等價於&a[1](&為取地址運算符)
E. C語言指針運算符
根據函讓塵消數執行的效果,顯然你的理解是錯的
*b++=0;
相當於*b=0;b=b+1;
這里的++是要等坦知b參與的運算結束之後再加1
注意 ++b 和 b++ 的兄和區別
F. c語言中指針運算符*和自增運算符++的優先順序
運算符的優先順序確定表達式中項的組合。這會影響到一個表達式如何計算。某些運算符比其他運算符有更高的優先順序,乘除運算符具有比加減運算符更高的優先順序。
例如 x = 7 + 3 * 2,在這里,x 被賦值為 13,而不是 20,因為運算符 * 具有比 + 更高的優先順序,所以首先計算乘法 3*2,然後再加上 7。
結合性是指具有相同優先順序的操作符的運算順序,從左至右運算稱為左結合,從右至左運算稱為右結合。
自增(++)和自減(--)操作符為對象加1或減1操作提供判雀了方便簡短的實現方式。它們有前置和後置兩種使用形式。到目前為止,我們已經使用過前自增操作,該操作使其操作數加1,操作結果是修改後的值。
C語言運算符是說明特定操作的符號,它是構造C語言表達式的工具。C語言的運算異常豐富,除了控制語句和輸入輸出以外的幾乎所有的基本操作都作為運算符處理。
(6)c語言指針運算符的擴展閱讀
運算符優先掘稿早級
1、函數計算優先。
2、其次是強制類型轉換。
3、自增、自減和取反次之。
4、先乘除再加減。
5、有括弧先算括弧內的。
6、表達式中出現連續兩個運算符時最好用空格隔開,如a+++b要寫成:a++ +b或a+ ++b。同一優先順序的運算符,運算次序由結合敬備方向所決定。
G. C語言中如何用指針運算符來表示一個二維數組的元素及地址
二維指針,就是說第一維是指針,第二維還是指針;
拿*(*(a+i)+j)來說:a是數組的首地址吧,然後+i,就是說a地址向後偏移i位。就是a+i的地址了,注意,這里a+i只是地址,用*符號取出該地址的數據,就是*(a+i),這里*(a+i)就是第一維指針,它指的是地址,不是數據。
而且後面的*(a+i)+j就是說以*(a+i)為首地址,偏移j位,然後使用*取內容,這里就是第二維了,取到的數據就是實際數據了
H. C語言指針變數運算
目前只有和整型的加減貌似可執行,是不是太奇葩了?
一點也不是,因為只需要加減運算
int
*p=(int
*)0xA00000000;
int
*p1=p+10;
int
x;
下面是指針可以進行的運算。
p-x;//指針
p+x;//指針
p--;//指針
p++;//指針
++p;//指針
--p;//指針
!p;
//
整數或bool
p-p1;//整數個數
p+10;//指針
p-10;//指針
指針不需要其他運算!!!!!
難道你是想這樣做!
p+=(p-p1)*200;
p-=(p-p1)/200;
p=(int
*)((int)p/20);
I. 關於C語言指針問題~
你首先要明白,指針運算符的作用,我用一言以概之,你在哪裡使用都不會錯。指針運算符*的作用是求出*後面所指地址里的值。因此只要*後面的變數表示的是一個地址就可以使用*運算符,來求出這個地址中的值,你不用管這個地址的表示形式是怎樣的,只要是地址就可以使用*來求出地址中的值。
第二:[ ]這個運算符的的運演算法則是,把左側的地址加上[ ]內的偏移量然後再求指針運算,注意有[ ]運算符的地方就有個隱含的指針,比如x[2]表示的就是將指針x偏移鬧迅2個單位量後再求指針運算。也就說x[2]與*(x+2)是相等的。對於二維數組a[3][4],因為數組名是一個地址,他是指向的二維數組第一行所表示的一維數組的地址,因此a與a+0是等價的。同樣a[0]與*(a+0)等價,從這里可以看出a[0]仍然表示的是地址,這個地址就是二維數組第1行第1個元素的地址,因此a[0]與a[0]+0是一樣的,那麼對a[0]+0這個地址再求指針就得到了a[0]+0這個地址的值,也就是*(a[0]+0)就等於a[0][0]也就二維數組第一行第一列元素的值了,要注意a[0]+0與a[0][0]是不相等的,a[0]+0表示的是地址,而a[0][0]表示的是對a[0]的地址偏移0個單位做升然後再求指針運算,也就是表示的是a[0]+0這個位置的值。
在二維數組中a[0]表示的是二維數組第一行第1列元素的地址,但&a[0]就與數組名a是等介的,表示的是二維數組第一行所包含的一維數組的首地址,液胡此也就是二維數組第一行的行地址。同樣a+1就與&a[1]是等價的,表示的是二維數組行二行的行地址,而a[1]則表示的是二維數組第二行第一列的元素的地址。