//V推論①:指針變量的步長只與‘指針變量的值’的類型有關(指針的值的類型 == 指針指向數據的類型)
//指針類型跟指針的值有關,指針是占據4個字節大小的內存空間,但是指針的類型卻是各不相同的 //指針的類型決定了指針指向的內存空間從哪個位置開始,從哪個位置結束 //普通變量名是一段內存空間的標識,普通變量名代表的是一段內存空間, //對於復雜變量(例如指針):要知道某個指針的步長,必須確定指針的類型 //指針的值永遠是一個十六進制數字,但是這個十六進制數字指向的內存空間卻是不相同的 //int a[5]; char *arr[4]={"aa","ss","dd","ee"};對於這2個一維數組而言 //a是一個指針,a指針的值是a[0]這個int型變量的地址,所以a的類型是int *; //arr是一個指針,arr指針的值是arr[0]這個char *型變量的地址,所以arr的類型是char ** //有人會想a的類型是int *,那么a的步長應該是sizeof(int *) 是4;其實不對,a的步長應該是a指向的內存空間的大小 //a指向的內存空間是int型的變量a[0],a[0]的大小是4個字節,因此a的步長是sizeof(int) 是4 雖然都是4 但是意義不一樣 //再來討論arr,由以上推論可得,arr的步長應該是arr指向內存空間的大小,arr指向內存空間是一個字符串的指針, //字符串的指針的大小是 sizeof(char *) = 4 個字節,所以arr的步長是4個字節 //舉例int a[5]={0},討論a和&a的步長 //a指向的是一個int型變量(上面已經詳述),a的步長是sizeof(int) = 4; //&a這指針指向的是一個int型的一維數組,這個int型的一維數組的大小是sizeof(int)*5 = 20; //所以&a的步長是20 //V推論②:多級指針是人為為‘指針本身’做的一種區分 //二級指針是指針本身類型的一種人為自定類別,但通常意義上指針的類型沒有任何關系 //一級指針與二級指針的區別在於,一級指針的值是某種類型的數據的地址,而二級指針的值是一個指針的地址 //指針的步長只跟指針的類型有關系,跟指針是幾級指針沒關系 #include<stdio.h> #include<stdlib.h> void main(){ int a[5] = { 1, 2, 3, 2, 1 }; printf("%x\n", &a); // 打印 76fc54 printf("%x\n", &a + 1); // 打印 76fc68 得出結論:&a的步長是20(特別提醒:這是十六進制) printf("\n-----------------\n"); char *myarr[] = {"aaaaa","bb","c","dede"}; printf("%x\n", myarr); // 打印 81fe88 printf("%x\n", myarr + 1); // 打印 81fe8c 得出結論:myarr的步長是4 system("pause"); }