指針
- 指針自增梁只、自減的結(jié)果,其實(shí)就是由指針指向的數(shù)據(jù)類型寬度決定的说敏!
- 指針加上或減去一個(gè)整數(shù)的結(jié)果鸥跟,其實(shí)就是指針指向的數(shù)據(jù)類型寬度決定的!
- 指針求差盔沫,得到的結(jié)果是整形医咨,其結(jié)果和指針指向的數(shù)據(jù)類型寬度有關(guān)!
- 這也就是指針的特點(diǎn)架诞! 它的運(yùn)算單位 是數(shù)據(jù)類型的寬度拟淮!
- 指針的運(yùn)算,是根據(jù)所指向的數(shù)據(jù)類型來(lái)的谴忧!
以下測(cè)試一下:
//指針的寬度
void func(){
// 編譯器決定了指針不能做乘法和除法惩歉。
int *varA;
varA = (int *)100;
// 指針自增自減的運(yùn)算結(jié)果,是由指針?biāo)赶虻臄?shù)據(jù)類型寬度決定的G温3虐觥!(數(shù)據(jù)類型:去掉一個(gè) * 看左邊)
varA++;
printf("%lu 個(gè)字節(jié)--%d",sizeof(varA),varA);
char*varB;
varB = (char *)100;
varB++;
printf("\n%lu 個(gè)字節(jié)--%d",sizeof(char),varB);
char**varC;
varC = (char**)100;
// varC++;
varC = varC + 1; // + 1 :自增一次
printf("\n%lu 個(gè)字節(jié)--%d",sizeof(char),varC);
int * a = 10;
int * b = 20;
int * c = a - b;
// int 的話則為 -10搏屑,但是 Int * 則需要 除以數(shù)據(jù)類型的寬度
//(-10/4)不足一個(gè)數(shù)據(jù)的寬度則進(jìn) 1(結(jié)果為負(fù)數(shù)不足一個(gè)數(shù)據(jù)的寬度則進(jìn) 1争涌,正數(shù)不進(jìn),猜測(cè)的辣恋,可以測(cè)一測(cè))亮垫;
printf("\n%d",c);//
a = 100;
b = 200;
printf("\n%d",a - b);
if (a > b) {
printf("\na > b");
}else{
printf("\na <= b");
}
}
對(duì)應(yīng)的打印結(jié)果如下:
8 個(gè)字節(jié)--104
1 個(gè)字節(jié)--101
1 個(gè)字節(jié)--108
2
-25
a <= b
另外也可以看出,指針在 64 位 CPU 中伟骨,占 64個(gè) Bit,即 8 Byte饮潦,int 為 4個(gè)字節(jié),char 為 1 個(gè)字節(jié)携狭。
指針?lè)磪R編:
void func3 (){
int *a;
int b = 10;
a = &b;
}
指針?lè)磪R編
C 語(yǔ)言數(shù)組訪問(wèn)
遍歷訪問(wèn):
void func2(){
// int *arrp = array[0] == array (數(shù)組即首元素的地址)
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++));
}
}
打印結(jié)果:
方法一:1
方法二:1
方法三:1
方法一:2
方法二:2
方法三:2
方法一:3
方法二:3
方法三:3
方法一:4
方法二:4
方法三:4
方法一:5
方法二:5
方法三:5
指針的基本用法
- 一級(jí)指針:
void func4 (){
char *p;
char c = *p;
}
x8 為空继蜡,即p 未賦值,取值崩潰
- 二級(jí)指針:
void func4 (){
// 1.
// char *p;
// char c = *p;
// 2.
char **p;
char c = **p;
}
二級(jí)指針取值
void func4 (){
// 1.
// char *p;
// char c = *p;
// 2.
// char **p;
// char c = **p;
// 3.
char **p;
char c = *(*(p + 2)+2);
}
image.png
- 相當(dāng)于 3 的寫(xiě)法。
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];
}
同上