C語言中指標的運算詳解

2021-03-04 02:03:22 字數 2166 閱讀 8324

在c語言中,指標和陣列名通常都可以混用。

例如char *p;

訪問時,*p跟p[0]是一樣的,*(p+1)跟p[1]是一樣的。

對於陣列

char b[5];

訪問時,b[0]跟*b是一樣的,b[2]跟*(b+2)是一樣的。

在一般的通訊中(例如串列埠),通常都使用位元組傳輸。而像float,long int之類的,

有4位元組。我的方法就是取它的位址,強制轉換為char型指標,然後當作陣列來用。

float x;

sbuf=((char*)&x)[0];

sbuf=((char*)&x)[1];

sbuf=((char*)&x)[2];

sbuf=((char*)&x)[3];

接收時,剛好倒過來。

更有趣的是,對於陣列形式,陣列名和後面的偏移量可以隨便換。

char buff[10];

//或者用 char *buff=&buffer;

buff[3]=0xaa;

3[buff]=0xaa; //居然是一樣的,倒塌...

因此,我認為編譯器是這麼幹的:對於形如***[yyy]這樣的表示式,會轉化為*(***+yyy),

因此寫成***[yyy]或者寫成yyy[***]都無所謂了...非典用法,請勿亂用,出了事偶不負責...

指標變數可以進行賦值運算、加減算術運算以及關係運算。

一、賦值運算

1、把乙個指標變數的值賦給指向相同型別變數的另乙個指標變數。如:

int x,*ptr_x,*ptr_y;

ptr_x=&x;

ptr_y = ptr_x;

指標 ptr_x 的值為變數 x 的位址。賦值語句將指標 ptr_x 的值賦給指標 ptr_y ,現在指標 ptr_x 和指標 ptr_y 指向同乙個變數 x。

2、把陣列的首位址賦給指標變數。如:

int a[5],*pa;

pa=a;

由於陣列元素占用記憶體中一塊連續的儲存單元,陣列名就表示陣列的首位址,所以可以將陣列名直接賦給乙個指向陣列的指標變數 pa。注意,在賦值語句的陣列名 a 前面不用取址符&。

二、算術運算

數值變數可以進行加減乘除算術運算。而對於指標變數,由於它儲存的乙個記憶體位址,那麼可以想象,對兩個指標進行乘除運算是沒有意義的。那麼指標的算術就主要是指指標的移動。

即通過指標遞增、遞減、加上或者減去某個整數值來移動指標指向的記憶體位置。

1、使用遞增/遞減運算子(++和--)將指標遞增或遞減。如:

int *ptrnum,arr_num[10];

ptrnum = arr_num;

ptrnum++;

其中,指標 ptrnum 指向整型陣列 arr_num ,即儲存陣列中第乙個元素的位址。然後,使用++ 運算子遞增該指標。這意味著, ptrnum 此時指向 arr_num[0] 位址之後的下乙個連續位址,即陣列中下乙個元素的位址。

應該注意,陣列指標變數向前或者向後移動乙個位置和位址加 1 或減 1 在概念上是不同的。指標變數加1,即向後移動1個位置表示指標變數指向下乙個元素的首位址。而不是在原位址基礎上加1。

所以,乙個型別為 t 的指標的移動,以 sizeof(t)為移動各單位。

2、將指標加上或者減去某個整數值。當指標加上或者減去某個整數值時,指標向前或者向後移動 n 個資料單元。如:

ptrnum = &arr_num[5];

ptrnum = ptrnum - 2;

此處指標首先指向陣列的第六個元素,然後將指標減去2。這意味著 ptrnum 此時指向陣列的第四個元素,即 arr_num[3]。

三、關係運算

兩個指標在有意義的情況下,可以做比較運算。如可以比較兩個指標,看它們是否相等,即這兩個指標是否指向同乙個變數。如:

#include

void main()

其中,宣告了兩個指標變數 ptrnum1 和 ptrnum2。另外還宣告了乙個int型別的變數value,初始值為1。接著將變數value的位址賦給指標 ptrnum1中。

然後將value加10,再將value的位址賦給指標ptrnum2中。通過if語句判斷 ptrnum1和ptrnum2是否相等,即判斷它們是否指向同乙個位址。由於指標ptrnum1和ptrnum2儲存的都是變數value的位址,因此即使變數value的值增加了10,位址也仍保持不變,因此相等條件的值為真,輸出結果為「兩個指標指向同乙個位址」。

C語言中指標的考點

考點一變數的位址和指標 1 位址和指標的定義 1 記憶體位址 計算機的記憶體是以位元組為單位的一片連續的儲存空間,每個位元組都有乙個編號,這個編號就稱為記憶體位址。一般情況下,在程式中只需指出變數名,無須知道每個變數在記憶體中的具體位址。程式中對變數驚喜訪問操作,實際上也就是對某個位址的儲存單元進行...

關於C語言中的變數

include void f5 int static int e void f4 int a void main void f4 int int e void f5 int b 首先,main函式中以10為引數呼叫函式f5,在函式f5中,給變數e賦值為5,接下來呼叫函式f4,引數b的值為10,在函式...

c語言邏輯運算子詳解

邏輯運算子 包括 1。邏輯與 2。邏輯或 3。邏輯非 邏輯運算子用於對包含關係運算子的表示式進行合併或取非 對於使用邏輯運算子的表示式,返回0表示 假 返回1表示 真 關於邏輯運算子的解釋 請注意 任何使用兩個字元做符號的運算子,兩字元之間不應有空格,即將 寫成 是錯誤的。假設乙個程式在同時滿足條件...