指針
- 指針自增、自減的結果,其實就是由指針指向的數據類型寬度決定的!
- 指針加上或減去一個整數的結果,其實就是指針指向的數據類型寬度決定的!
- 指針求差,得到的結果是整形,其結果和指針指向的數據類型寬度有關!
- 這也就是指針的特點! 它的運算單位 是數據類型的寬度!
- 指針的運算,是根據所指向的數據類型來的!
以下測試一下:
//指針的寬度
void func(){
// 編譯器決定了指針不能做乘法和除法。
int *varA;
varA = (int *)100;
// 指針自增自減的運算結果,是由指針所指向的數據類型寬度決定的!!!(數據類型:去掉一個 * 看左邊)
varA++;
printf("%lu 個字節--%d",sizeof(varA),varA);
char*varB;
varB = (char *)100;
varB++;
printf("\n%lu 個字節--%d",sizeof(char),varB);
char**varC;
varC = (char**)100;
// varC++;
varC = varC + 1; // + 1 :自增一次
printf("\n%lu 個字節--%d",sizeof(char),varC);
int * a = 10;
int * b = 20;
int * c = a - b;
// int 的話則為 -10,但是 Int * 則需要 除以數據類型的寬度
//(-10/4)不足一個數據的寬度則進 1(結果為負數不足一個數據的寬度則進 1,正數不進,猜測的,可以測一測);
printf("\n%d",c);//
a = 100;
b = 200;
printf("\n%d",a - b);
if (a > b) {
printf("\na > b");
}else{
printf("\na <= b");
}
}
對應的打印結果如下:
8 個字節--104
1 個字節--101
1 個字節--108
2
-25
a <= b
另外也可以看出,指針在 64 位 CPU 中,占 64個 Bit,即 8 Byte,int 為 4個字節,char 為 1 個字節。
指針反匯編:
void func3 (){
int *a;
int b = 10;
a = &b;
}
指針反匯編
C 語言數組訪問
遍歷訪問:
void func2(){
// int *arrp = array[0] == array (數組即首元素的地址)
int array[5] = {1,2,3,4,5};
int *arrP = array;
for (int i = 0 ; i < 5; ++i) {
// 1.
printf("方法一:%d\n",array[I]);
// 2.
printf("方法二:%d\n",*(array+i));// array+i 為地址
// 3.
printf("方法三:%d\n\n",*(arrP++));
}
}
打印結果:
方法一:1
方法二:1
方法三:1
方法一:2
方法二:2
方法三:2
方法一:3
方法二:3
方法三:3
方法一:4
方法二:4
方法三:4
方法一:5
方法二:5
方法三:5
指針的基本用法
- 一級指針:
void func4 (){
char *p;
char c = *p;
}
x8 為空,即p 未賦值,取值崩潰
- 二級指針:
void func4 (){
// 1.
// char *p;
// char c = *p;
// 2.
char **p;
char c = **p;
}
二級指針取值
void func4 (){
// 1.
// char *p;
// char c = *p;
// 2.
// char **p;
// char c = **p;
// 3.
char **p;
char c = *(*(p + 2)+2);
}
image.png
- 相當于 3 的寫法。
void func4 (){
// 1.
// char *p;
// char c = *p;
// 2.
// char **p;
// char c = **p;
// 3.
char **p;
// char c = *(*(p + 2)+2);
// 4.
char c = p[2][2];
}
同上