部分引用數組
- c語言指針怎麼理解 知乎
- 程序設計入門————c語言 (浙江大學翁愷)
- 《c primer plus》第六版
int *a, b 或 int* a, b 中只有a是int指針類型,b是int整型。函數
關於電腦大小端的討論:大端是指是指數據的高字節,保存在內存的低地址中,而數據的低字節,保存在內存的高地址中。小端是指數據的高字節保存在內存的高地址中,而數據的低字節保存在內在的低地址中。例以下圖:
測試
32位和64位下指針的長處不一樣,32位下爲4個字節,和int同樣,64位下8個字節。設計
#include <stdio.h> int main(){ int a[10]={1,2,3,4,5,6,7,8,9,10}; //定義一個整型數組,這裏a實質上是一個指向數組中第一個數據a[0]的指針 int *p=a; printf("%d\n",*p); printf("%d",*(p+1)); return 0; }
返回結果爲:
1
2指針
#include <stdio.h> int main(){ int d[10]; int *e; e=&d[0]; //e保存了數組d的第一個數據的地址 for (int i=0; i<10; i++){ *e = i; //把該地址中的數據依次賦值0,1,2,3,4,5,6,7,8,9 e++; //地址累加一次,也就是數組中下一個數據的地址 } for (int i=0; i<10; i++){ printf("%d\n", d[i]); //打印數組d中的全部元素 } return 0; }
#include <stdio.h> //此方法爲最簡單,最基礎的數組遍歷 int search(int key, int a[], int len) int main() { int a[]= {1,3,5,2,9,4,12,23,15,32}; int r = search (12, a, sizeof(a)/sizeof(a[0])); //傳入參數的時候在main函數中計算好函數的個數傳入到search函數中;另外,此處a傳入的時a[0]元素的地址。 printf("%d\n", r); return 0; } int search(int key, int a[], int len) //len變量必需要加,由於在search函數中沒法用sizeof函數計算數組的大小 { int ret = -1; int i; for (i=0; i<len; i++){ if (key == a[i]){ ret = i; break; } } return ret; }
#include<stdio.h> int main(){ int a[2][3]={{1,2,3},{4,5,6}}; printf("%p\n",a); //輸出指針a數據,也就是指針a[0]的地址 printf("%p\n",a+1); //輸出a+1的數據 ,也就是a[1]的地址 printf("%p\n",&a[0]); printf("%p\n",&a[1]); //驗證上述 printf("%p\n",(*a)+1); //輸出的是a[0][1]的地址 printf("%p\n",&a[0][1]); //驗證 printf("%d\n",*(a[0])); //輸出的是a[0]a[0]的值 printf("%d\n",*(*(a+1)+1)); //輸出的是a[1][1]的值 }
注意:a是一個2行3列的數值,a+1表示的a[1]值所在的地址,a[1]的值又表明a[1][0]的值所在的地址code
int i=2; int *a=&i 和 char j='m'; char *b=&j 區別在於:int佔據四個字節,a中雖然記載的i的第一個字節的地址,可是因爲a是int類型的指針,*a讀取的時候自動再日後讀3個字節;而b是char類型的指針,則只讀取當前記錄的這一個字節,天然不能用指針b來保存int i的值。blog
#include <stdio.h> int main(){ int i = 2; int j = 's'; int *a = &i; char *b = &i; int *m = &j; char *n = &j; printf("%d\n", *a); printf("%d\n", *b); //會產生warning /* 解釋爲何前兩行輸出爲何同樣: * 在存儲中,2做爲int存儲爲 00000010 00000000 00000000 00000000 四個字節,用此種表示方法是由於個人電腦是個小端電腦(Little-endian)。詳述見下條。 * a 和 b 所記錄的都是四個字節中第一個字節的地址,*a讀取到的是4個完整的字節,而*b讀取到的是第一個字節 00000010,因爲巧合,兩者所表明的都是數字1。 */ printf("%c\n", *m); //會產生warning printf("%c\n", *n); return 0; }
#include <stdio.h> int main() { int a = 1, b = 2; char c = 'c', d = 'd'; int *m, *n; char *j, *k; m = &a; n = &b; j = &c; k = &d; printf("int變量在內存中的存儲狀況"); printf("a %p\n", m); printf("b %p\n", n); //因爲棧自頂向下的存儲方法,內存位置上a與b兩個元素是緊鄰着的,a位置高,b低,相差四個字節。 printf("\n"); printf("對int指針變量+1會獲得什麼結果,實際改變幾個字節?\n"); printf("&b+1 %p\n", n+1); printf("&a-&b %d\n", m-n); //上兩個語句測試獲得結果,a與b的地址m,n相差並非4而是1。由於相差的是存儲單元數而不是字節數 printf("\n"); printf("char指針變量什麼狀況,原本就相差1個字節?\n"); printf("c %p\n", j); printf("d %p\n", k); //因爲char變量只佔1個字節,因此這兩個變量位置地址相差爲1 printf("\n"); printf("\n"); printf("int型指針變量佔據幾個字節?\n"); printf("&m %p\n", &m); printf("&n %p\n", &n); printf("char型指針變量佔據幾個字節?\n"); printf("&j %p\n", &j); printf("&k %p\n", &k); //能夠獲得,在64位系統上,像m,n這種指針自己的存儲都是佔據8個字節,不論是char類型仍是int類型。 return 0; }
一句話歸納指針的加減:指針加1,指針的值遞增它所指向類型的大小(以字節位單位)
dates + 2 == &dates[2]
*(dates + 2) == dates[2]內存