指针&数组与指针&指针的运算 一,指针的概念 指针是一种变量类型。这种类型的变量只用用来存放内存地址。指针变量前面的数据类型表示这个指针指向的这片空间的类型。 在同一个系统中,指针变量的大小都是一样大的。 ==》int *p; char *p1; double *p2 ; ==> p,p1, p2大小都是一样大的。 ==》内存:一栋大楼 ==》每一个内存单(字节):大楼里面的房间 ==》内存地址:房间号 ==》指针: 专门记录房间号的大小 二,指针的赋值与使用 1.赋值 ·初始化赋值 : int a = 10; int *p = &a; //定义一个指针p存放变量a的地址 ·直接赋值 : int a = 10; int *p; p = &a; //定义一个指针p,然后把a的地址赋值给指针 p; 2.指针的使用 int a = 10; int *p = &a; 此时 a <==> *p *在修饰一个变量的时候表示对这个变量进行解引用(通过这个地址找到这片空间) 三.指针与数组 1.数组与指针的关系 ==> 数组名即指针。 ==> 数组名就是数组的基地址 ==> int A[3]; ==> A 就是数组A的首地址,也是数组第一个素的地址。
2.数组名与指针的区别 1)==》数组名不可以重新赋值!普通指针变量可以重新赋值! ==> 数组名是整个数组的标志,数组素都是通过数组名加上下标进行访问,如果数组名指向的空间改变,那么这个数组空间就“丢失”了,我们找不到这个数组空间了,C语言中不允许出现这种情况! 2.对数组名取地址的结果是什么? ==》 A == &A[0] == &A 表示的都是数组的首地址! ==》这三个类型的指针类型不一样! A == &A[0] ==> int * ==》&A表示数组A类型的地址 四,指针的运算 1.*与& & 和 * 之间是一个互逆的关系 ==> int a = 10; int *p = &a; ==> 此时 p == &a ; *p == a; ==> *(&a) == a ==> &是通过变量名找到这个变量的基地址; ==> *是通过变量的基地址找到这个变量的空间; 2,数组名进行加法运算 ==》int A[5] = {10,20,30,40,50}; ==》 A == &A[0] ==》 A +1==> &A[1] 结论:数组名进行加法运算时,存在这样的运算规则 A + i ==》内存地址 A + sizeof(数组类型)*i; ==>例如: int A[5]; 假设 A = 0xa0; A+1 = 0xa4; A+3 = 0xac 注意:指针加上一个数字得到结果还是一个指针。指针的加法得到的结果会根据数据类型的大小进行加法。 ==》例题: 加上有一个数组 short A[3] = {100, 200, 300}; short *p = A; ==> A数组首地址是 0xab20, 计算以下表达式的值 ==> A+1, p+2, &A+1, A[0]+1, *(p+1), &A[2] ==> A + 1 ==> 0xab22 ; ==> p+2 ==> 0xab24; ==> &A+1 ==> &A = ? 0xab20 + sizeof(A) = 0xab26 ==> A[0]+1 == > 101; ==> *(p+1) ==>200 ==> &A[2] = 0xab20 + 2*sizeof(short) = 0xab20+4 = 0xab24 3.指针的加减运算 ·指针间的加法是没有意义的! ·指针间的减法的结果表示两个指针间的数据的个数。(一般用于数组) ==》int A[5]; ==》&A[0], &A[3], ==> &A[3] – &A[0] == ? 3 ==》int A[5]; ==》&A[0], &A[3], ==> &A[3] – &A[0] == ? 3 ==> &A[3] ==> & *(A+3) ==> A+3 ==> &A[0] ==> & *(A) ==> A ==> 指针相减结果 = (内存地址1-内存地址2)/sizeof(数据类型);
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/88744.html