目錄
指標定義:指標變數,用於存放位址。位址唯一對應一塊記憶體空間。
指標大小:固定32位平台下佔4個位元組,64位8個位元組。
指標型別:型別決定指標整數的步長及指標解引用時訪問的大小。
指標運算:指標解引用,指標整數,指標-指標,指標關係運算。
本章節在此基礎上,對c語言階段指標進行更深層次的研究。
字元指標,存入字元的位址,型別為char *
1.指向單個字元變數
char ch = 'w';
const char* pch = &ch;
這種很容易理解,就是指標解引用訪問字元變數。
2.指向字串首字元
char* pc = "hello";
printf("%s\n", pc);
這種是把字串"hello"放進指標嘛?
其實不然,類似於陣列名,該指標存的是常量字串"hello"的首字元的位址。通過對指標解引用訪問首字元位址,從而找到整個字串。
char* pc = "hello";
printf("%c\n", *(pc + 1));//e
printf("%s\n", pc);//hello
printf("%s\n", pc + 1);//ello
字串本質上還是在空間上連續存放,所以指標整數同樣有訪問的效果。由此也可以看出%s的用法,把位址給%s會將其後的內容看作字串並列印直到\0 。(所以我猜測%s的s是string的意思)
例題charnqwdfals str1 = "hello bit";
char str2 = "hello bit";
char* str3 = "hello bit";
char* str4 = "hello bit";
if (str1 == str2)
printf("str1 = str2\n");//1
else
printf("str1 != str2\n");//2
if (str3 == str4)
printf("str3 = str4\n");//3
else
printf("str3 != str4\n");//4
str1(3)==str2(4),比較的是二者其實位置位址是否相同。(位址才是真正判斷二者是否相同的要素)
答案是2和3。因為1和2是用字串初始化陣列,3和4是指標指向常量字串。
str1和str2是普通的陣列,是在記憶體上開闢了兩塊空間不過存放了一樣的資料。
str3和str4指向常量字串,存放在記憶體的常量區,是不可被修改且具有唯一性即常量區只存放乙個。所以str3和str4指向的都是同乙個字串。
常量區的儲存特點:存放在常量區的資料不可被修改,正因為不可修改所以存乙份就夠了。後期如果需要,使用的是同一資料。(資料還是同乙個資料,只是用不同的指標維護)
小結1.常量字串不可被修改,存放在記憶體的常量區。
2.具有唯一性即常量區只存放乙個。
int arr[10];//整型陣列
char ch[5];//字元陣列程式設計客棧
float f[20];//浮點型陣列
可見,元素型別也就是陣列的「型別」。
char* pch[5];
int* parr[10];
float* pf[20];
指標陣列就是存放指標的陣列。
int arr[10];
int* arr[10];
整型陣列的陣列名arr,即首元素位址,是一級指標。
指標陣列的陣列名parr,也是首元素位址,不過其首元素為int*型別變數,所以parr就是二級指標。
int arr1 = ;
int arr2 = ;
int arr3 = ;
int* parr = ;
for (int i = 0; i < 3; i++)
printf("\n");
}//答案
1 2 3 4 5
2 3 4 5 6
3程式設計客棧 4 5 6 7
ps:parr[i] <==> *(parr+i)
*(parr[i]+j) <==> *(*(parr+i)+j) <==> (*parr+i)[j] <==> parr[i][j]
通過指標陣列訪問整型陣列的每個元素。parr[i][j]和*(*(parr+i)+j)本質上是等價的。
const char* pch = ;
for (int i = 0; i < 3; i++)
printf("\n");
}列印字串使用%s更簡單,若要使用%c,就是得到每個字串的起始位址,分別向後訪問。
從這裡也可以看出陣列和指標的關係,我願稱之為*和的愛恨情仇!
本文標題: c語言高階:指標的高階(1)
本文位址:
C語言高階指標 1
c語言的指標是c語言這門語言的精華所在,當然也是讓很多人詬病的地方。指標是什麼?有這麼一句話 對於錘子來說,一切都是釘子。那麼換句話講指標,即 對於指標來說,一切都是位址 記憶體是由乙個個記憶體單元構成的,每個記憶體單元都有自己的位址。而指標就是用來存放這些位址的。凡是可以用指標來儲存的變數,在指標...
C語言高階 指標的高階 3
目錄 實踐之中不免會碰到陣列和指標作函式引數而如何設計形參的問題。一維陣列傳參,下列接收方式是否可行呢?1.void test int arr 2.void test int arr 10 3.void test int arr int main test arr return 0 1.陣列傳引數組...
C語言 高階指標
import import myfunction.h 巨集後面不要加分號 define kimagewidth 200 define kimageheight 200 有引數的巨集 define kmax a,b a b a b 加上括號 define kmul a,b a b define and...