嵌入式-C语言基础:指针偏移打印数组
在C语言中,数组名代表数组中首元素的地址,所以,下面两句获取数组的首地址是等价的:
#include<stdio.h> int main() { int a[5]={1,2,3,4,5}; int *p=&a[0]; int *p2=a; printf("地址p=%p\n",p); printf("地址p2=%p",p2); return 0; }
输出结果:
地址p=000000000061FDF0
地址p2=000000000061FDF0
根据指针地址偏移,可以打印数组
#include<stdio.h> int main() { int a[5]={1,2,3,4,5}; int *p=&a[0]; int *p2=a; printf("地址p=%p\n",p); printf("地址p2=%p\n",p2); printf("打印数组:\n"); for(int i=0;i<sizeof(a)/sizeof(a[0]);i++) { printf("%d",*(p+i));//带上*表示取该地址的值 } return 0; }
输出结果:
地址p=000000000061FDF0
地址p2=000000000061FDF0
打印数组:
12345
使用指针访问数组的效率是远远大于数组下标的访问效率。
也可以通过下面方法,将指针当作数组面名,通过下标法来访问:
#include<stdio.h> int main() { int a[5]={1,2,3,4,5}; int *p=&a[0]; int *p2=a; printf("地址p=%p\n",p); printf("地址p2=%p\n",p2); printf("打印数组:\n"); for(int i=0;i<sizeof(a)/sizeof(a[0]);i++) { printf("%d",p[i]);//像数组一样访问 } return 0; }
也可以通过下面的方法:
#include<stdio.h> int main() { int a[5]={1,2,3,4,5}; int *p=&a[0]; int *p2=a; printf("地址p=%p\n",p); printf("地址p2=%p\n",p2); printf("打印数组:\n"); for(int i=0;i<sizeof(a)/sizeof(a[0]);i++) { printf("%d",*(a+i));//数组++ } return 0; }
但是不能对数组名++,编译会发生错误
#include<stdio.h> int main() { int a[5]={1,2,3,4,5}; int *p=&a[0]; int *p2=a; printf("地址p=%p\n",p); printf("地址p2=%p\n",p2); printf("打印数组:\n"); for(int i=0;i<sizeof(a)/sizeof(a[0]);i++) { printf("%d",*a++);//数组++,会发生编译错误 } return 0; }
数组++是禁止的,因为++相当于更改数组的地址,而数组地址是固定的,是一个常量,对它进行++操作是不允许的。
并且,在操作系统中,都用8个字节来表示一个地址:
#include<stdio.h> int main() { printf("整型指针:%d\n",sizeof(int *)); printf("字符型指针:%d\n",sizeof(char *)); printf("浮点型指针:%d\n",sizeof(float *)); return 0; }
输出结果:
整型指针:8
字符型指针:8
浮点型指针:8
4556