今天我們學習指標,我們現在來了解一下指標它是什麼呢?
在電腦科學中,指標是程式語言中的乙個物件,利用位址,它的值直接指向存在電腦儲存器中另乙個地方的值。
由於通過位址能找到所需要的變數單元,可以說位址指向該變數單元。因此將位址形象的稱為「指標」。
意思是通過它能找到以它為位址的記憶體單元。我們可以這麼理解:
對應**如下:
要想將&num(num的位址)儲存到p中,我們知道p就是乙個指標變數,那麼它的型別是什麼樣的呢?#include int main()
1、指標是存放地之才出現的,位址是為了標示一塊位址空間的。2、指標讓位址有地方存放,指標讓記憶體的訪問更加方便。
3、指標的大小在32位平台是4個位元組,在64位平台是8個位元組。
指標和指標型別
我們來討論一下指標的型別
我們都知道,變數有不同的型別,整形,浮點型等。那麼指標有沒有型別呢?
準確的來說是有的。
int num = 10;
p = #
我們這裡給出乙個指標變數相應的型別。
char *pc = null;
int *pi = null;
short *ps = null;
long *pl = null;
float *pf = null;
double *pd = null;
其實這裡可以看到,指標是有型別的,型別是:type + *的方式。
其實:char*型別的指標是為了存放char型別變數的位址。
short*型別的指標是為了存放short型別變數的位址。
int*型別的指標是為了存放int型別變數的位址。
以此類推。
那我們想一下,為什麼要這麼做呢??
1.只要有型別的區分,就定出一定的規則,使得編碼會更加嚴禁。
2.確定了指標運算的規律。
指標型別如何確定指標的運算的規律:
1.指標+-整數。
2.指標的解引用。
指標+-整數
#include int main()
總結:指標的型別決定了指標向前或向後走一步有多大(距離)。
指標的解引用
#include int main()
總結:
指標的型別決定了對指標解引用的這時候有多大許可權(能操作幾個位元組)。
比如:char*的指標解引用就只能訪問乙個位元組,而int*的指標的解引用就能訪問4個位元組。
二級指標
指標變數也是變數,是變數就有位址,那麼指標變數的位址存放在**呢?
這就是二級指標。
對於二級指標的運算有:
1.*ppa通過對ppa中的位址進行解引用,這樣找到的是pa,*ppa其實訪問的就是pa。
int b = 20;
*ppa = &b;//等價於 pa = &b;
2.**ppa先通過*ppa找到pa,然後對pa進行解引用操作:*pa,那麼找到的就是a。
**ppa = 30;
//等價於*pa = 30;
//等價於a = 30;
指標表示式解析當有**
char ch = 'a';
char *cp = &ch;
那麼下面的**是什麼意思?
&ch;
cp;&cp;
*cp+1;
*(cp+1);
++cp;
cp++;
*++cp;
*cp++;
++*cp;
(*cp)++;
++*++cp;
++*cp++;
指標的運算1.指標+-整數
2.指標-指標
3.指標的關係運算
#define n_values 5
float values[n_values];
float *vp;
//指標+-整數;指標的關係運算
for (vp = &values[0]; vp < &values[n_values];)
指標-指標
int my_strlen(char *s)
在關係運算中
for(vp = &values[n_values]; vp > &values[0];)
**簡化,將**修改如下:
for(vp = &values[n_values-1]; vp >= &values[0];vp--)
實際在絕大部分的編譯器上是可以順利完成任務的,然而我們還是應該避免這樣寫,因為標準並不保證它可行,
標準規定:
允許指向陣列的指標與指向陣列最後乙個元素後面的那個記憶體位置的指標比較,但是不允許與指向第乙個元素之前的那個記憶體位置的指標進行比較。
模擬實現strlen
三種方式
方式1:
int my_strlen(const char * str)
return count;
}
方式2 :
int my_strlen(const char * str)
方式3:
int my_strlen(char *s)
模擬實現strcpy
char *my_strcpy(char *dest, const char*src)
return ret;
}
模擬實現strcat
char *my_strcat(char *dest, const char*src)
while ((*dest++ = *src++))
return ret;
}
模擬實現strstr
char *my_strstr(const char* str1, const char* str2)
if (*substr == '\0')
return cp;
cp++;
}}
模擬實現strcmp
int my_strcmp(const char * src, const char * dst)
模擬實現memcpy
void * memcpy(void * dst, const void * src, size_t count)
return(ret);
}
模擬實現memmove
void * memmove(void * dst, const void * src, size_t coun
t) }
else
} return(ret);
}
C語言回顧 八 指標
指標 import 指標作為引數可以實現兩個數的交換 指標x和y操作是傳過來的實參a,b所對應的位址空間 void changevalue1 int x,int y void changevalue1 int x,int y 列印陣列全部元素 void printfarray int arr,int...
C語言總結4 指標上
指標的定義 type 資料型別 不知道指標指向 時可以置為null,沒有指向固定位置的指標為野指標 指標的大小在32位平台下是4位元組,在64位平台下是8位元組 includeint main 對指標加減1是加減上其所指向型別的大小 指標指向的都是首位址,所以加減一是加減型別所佔位元組數 指標的型別...
C語言(八) 指標(2)陣列和指標
函式引數表中的陣列實際上是指標 int main int argc,char argv int min,max printf main sizeof a lu n sizeof a minmax a,sizeof a sizeof a 0 min,max printf min d n min pri...