ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

嵌入式基础day07学习笔记

嵌入式基础day07学习笔记 指针的运算指针运算指针运算是以指针所存放的地址作为运算量而进行的指针运算的实质就是地址的计算指针的算数运算指针加上整数指针减去整数, 指针递增指针递减和两个指针相减。​ 指针加减一个n的运算: px n px - n​ 移动步长是指针的目标注意不同数据类型的两个指针实行加减整数运算是无意义的pxn表示的实际位置的地址量是(px) sizeof(px的类型) * npx-n表示的实际位置的地址量是 (px) - sizeof(px的类型) * n两指针相减运算px-py 运算的结果是两指针指向的地址位置之间相隔数据的个数两指针相减的结果值不是地址量而是一个整数值表示两指针之间相隔数据的个数。指针的算数运算应用大小端模式-电脑存储模式大小端指的是在存储器中存放数据的字节顺序小端模式是指数据的低字节保存在内存的低地址中大端模式是指数据的低字节保存在内存的高地址中写一段代码判断机器是大端模式还是小端模式#includestdio.h int main() { unsigned int a 0x12345678; char *p (char*)a; printf(%#x\n, a); printf(%#x\n, *p); p; printf(%#x\n, *p); p; printf(%#x\n, *p); p; printf(%#x\n, *p); return 0; ​ } ​指针的关系运算两指针之间的关系运算表示它们指向的地址位置之间的关系。指向地址大的指针大于指向地址小的指针。但可以和零进行等于或不等于的关系运算判断指针是否为空。指针与数组的基本用法指针与数组数组指针是指数组在内存中的起始地址数组元素的地址是指数组元素在内存中的起始地址。一维数组的数组名为一维数组的指针起始地址例如double x[8];这中间x为数组的起始地址案例1:#includestdio.h int main() { int a[] {1,3,5,7,9}; int i; printf(%p\n,a); printf(%ld\n,sizeof(a)); for(i 0;i sizeof(a)/sizeof(int); i) { //printf(%p ,a[i]); printf(%p ,ai); } for(i 0;i sizeof(a)/sizeof(int); i) { printf(%d %d\n,*(ai), a[i]); } ​ putchar(\n); ​ return 0; }设指针变量px的地址值等于数组的指针x即指针变量px指向数组的首元数则x[i] 、* (pxi)、* (xi) 和px[i]具有完全相同的功能访问数组第i1个数组元素。案例 2#includestdio.h int main() { int a[] {1,3,5,7,9}; int *p a; int i; for(i 0;i sizeof(a)/ sizeof(int); i) { printf(%d %d %d %d\n,*(a i), a[i], *(p i), p[i]); } ​ putchar(\n); ​ return 0; }指针与数组使用注意事项指针变量和数组在访问数组中元素时一定条件下其使用方法具有相同的形式因为指针变量和数组名都是地址量数组名和指针有什么区别含义不同数组名代表一个数组存放相同类型的元素指针代表存储地址的变量使用不同数组名是地址常量不能修改指针是变量可以存储其它值也可自增c长度不同sizeof数组名代表数组占用的总空间sizeof指针和操作系统有关32位系统4个字节本质不同指针变量是地址变量而数组名是地址常量案例#includestdio.h int main() { int a[] {1,3,5,7,9}; int *p a; printf(before: %d %p\n,*p, p); p a[2];//p a 2; printf(after:%d %p\n, *p, p); ​ printf(sizeof(a)%ld\n,sizeof(a)); printf(sizeof(p)%ld\n,sizeof(p)); ​ printf(%d %d %d %d\n, p[1], *(p 1), a[1], *( a 1)); printf(%d %d\n,p[-1], *(p - 1)); return 0; }指针与数组相关笔试题int a[ ]{1,2,3,4,5,6,7,8,9,10},*p a, i1; 数组元素地址的正确表示是DA(a1) Ba Cp Dp[i]数组名是地址常量p,p-- (对)a,a-- (错)a1,*(a2) (对)判断下面sizeof的值int a[] { 1, 2, 3, 4 };printf(%ld\n, sizeof(a));printf(%ld\n, sizeof(*a));printf(%ld\n, sizeof(a 1))printf(%ld\n, sizeof(a[1]));printf(%ld\n, sizeof(a[0]));printf(%ld\n, sizeof(a[0] 1));答案1648488代码案例#includestdio.h int main() { int a[] {1, 2, 3, 4}; ​ printf(sizeof(a)%ld\n,sizeof(a)); printf(sizeof(*a)%ld\n,sizeof(*a)); printf(sizeof(a1)%ld\n,sizeof(a 1)); printf(sizeof(a[1])%ld\n,sizeof(a[1])); printf(sizeof(a[0])%ld\n,sizeof(a[0])); printf(sizeof(a[0]1)%ld\n,sizeof(a[0] 1)); ​ return 0;一级指针与二维数组二维数组的元素连续存储按行优先存案例编程实现使用一级指针遍历二维数组正常遍历二维数组#includestdio.h int main() { int a[3][4] {{1, 2, 3, 4},{4, 5, 6, 8},{2, 9, 3, 5}}; int i, j; int n sizeof(a)/ sizeof(a[0]); int m sizeof(a[0])/ sizeof(int); ​ for(i 0; i n; i){ for(j 0; j m; j){ printf(%d, a[i][j]); } putchar(\n); } ​ return 0; }一级指针遍历二维数组#includestdio.h int main() { int a[3][4] {{1, 2, 3, 4},{4, 5, 6, 8},{2, 9, 3, 5}}; int i; int n sizeof(a)/ sizeof(a[0]); int m sizeof(a[0])/ sizeof(int); int *p; ​ p a[0][0]; for(i 0;i n * m; i){ printf(%d %d\n,*(p i), p[i]); } return 0; }数组指针与二维数组把二维数组看作由多个一维数组构成。int a 3][3]含有三个元素a[0]、a[1]、a[2]元素a[0]、a[1]、a[2]都是一维数组名二维数组名代表数组的起始地址数组名加1是移动一行元素。二维数组名常被称为行地址行指针数组指针存储行地址的指针变量叫做行指针变量。形式如下数据类型 (*指针变量名)[表达式] ;int a2][3]; int (*p)[3];方括号中的常量表达式表示指针加1移动几个数据。数组指针应用编程实现使用行指针遍历二维数组#includestdio.h int main() { int a[3][4] {{1, 4, 6 ,8 }, {2, 4, 5, 9}, {3 ,6, 9, 1}}; int (*p)[4] a; int i, j; int n, m; ​ printf(%p %p\n, a, a 1); printf(%p %p\n, a[0], a[0]1); n sizeof(a)/ sizeof(a[0]); m sizeof(a[0])/ sizeof(int); for( i 0;i n; i){ for(j 0; j m;j){ //printf(%d, a[i][j]); //printf(%d,*(a[i]j)); //printf(%d,*(*((ai)j))); printf(%d %d %d,p[i][j], *(p[i]j), *(*(pi)j)); } printf(\n);数组指针笔试题int a[3][4] { 0 }; printf(%ld\n, sizeof(a[0])); printf(%ld\n, sizeof(*a)); printf(%ld\n, sizeof(*(a 1))); printf(%ld\n\n, sizeof(*(a[0] 1))); printf(%ld\n, sizeof(a 1)); printf(%ld\n, sizeof(a[0] 1)); printf(%ld\n\n, sizeof(a[0] 1)); printf(%ld\n\n, sizeof(*(a[0] 1)))计算上面给出的值答案16,16,16,16,8,8,8,4int a[] { 1, 2, 3, 4 }; printf(%ld\n, sizeof(a)); printf(%ld\n, sizeof(*a)); printf(%ld\n, sizeof(a 1));答案8,16,8程序运行的结果是什么呢int a[5] { 1, 2, 3, 4, 5 }; ​ int* ptr (int*)(a 1); ​ printf(%d,%d,(a 1),(ptr - 1)); ​答案5,1int a2 { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; ​ int* ptr1 (int*)(a 1); ​ int* ptr2 (int)((a 1)); ​ printf(%d,%d,(ptr1 - 1),(ptr2 - 1)); ​答案10,5int a5; ​ int(*p)[4]; ​ p a; ​ printf(%d\n, p2 - a2); ​答案-2
返回列表