指针加1的含义
- 一、p+1
-
- 二、*(p+1) 与 *p+1
-
- 三、*p++
-
- 四、指针减法运算
-
- 五、void*
- 六、指针用来做什么?
一、p+1
p+1 表示地址值加上指针所指类型的 sizeof(),也就是指向了下一个元素。
实例
#include <stdio.h>
int main()
{
char a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
char* p1 = a;
printf("p1=%p\n", p1);
printf("p1+1=%p\n", p1 + 1);
int b[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int* p2 = b;
printf("p2=%p\n", p2);
printf("p2+1=%p\n", p2 + 1);
float c[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
float* p3 = c;
printf("p3=%p\n", p3);
printf("p3+1=%p\n", p3 + 1);
double d[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
double* p4 = d;
printf("p4=%p\n", p4);
printf("p4+1=%p\n", p4 + 1);
return 0;
}
运行结果
二、*(p+1) 与 *p+1
实例
#include <stdio.h>
int main()
{
char a[] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18 };
char* p1 = a;
printf("*p1=%d\n", *p1);
printf("*(p1+1)=%d\n", *(p1 + 1));
printf("*p1+1=%d\n", *p1 + 1);
int b[] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18 };
int* p2 = b;
printf("*p2=%d\n", *p2);
printf("*(p2+1)=%d\n", *(p2 + 1));
printf("*p2+1=%d\n", *p2 + 1);
float c[] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18 };
float* p3 = c;
printf("*p3=%f\n", *p3);
printf("*(p3+1)=%f\n", *(p3 + 1));
printf("*p3+1=%f\n", *p3 + 1);
double d[] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18 };
double* p4 = d;
printf("*p4=%lf\n", *p4);
printf("*(p4+1)=%lf\n", *(p4 + 1));
printf("*p4+1=%lf\n", *p4 + 1);
return 0;
}
运行结果
三、*p++
含义:取出 p 所指的那个数据,之后把 p 移到下一个位置去,另外 * 的优先级没有 ++ 高。
实例
#include <stdio.h>
int main()
{
char a[] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, -1 };
char* p = a;
for (int i = 0; i < sizeof(a) / sizeof(a[0]) - 1; i++) {
printf("%d\t", p[i]);
}
printf("\n");
while (*p != -1) {
printf("%d\t", *p++);
}
printf("\n");
for (p = a; *p != -1; p++) {
printf("%d\t", *p);
}
printf("\n");
for (p = a; *p != -1;) {
printf("%d\t", *p++);
}
printf("\n");
return 0;
}
运行结果
四、指针减法运算
实例
#include <stdio.h>
int main()
{
char a[] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18 };
char* p1 = a;
char* p2 = &a[5];
printf("p1=%p\n", p1);
printf("p2=%p\n", p2);
printf("p2-p1=%d\n", p2 - p1);
printf("*p1=%d\n", *p1);
printf("*p2=%d\n", *p2);
printf("*p2-*p1=%d\n", *p2 - *p1);
int b[] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18 };
int* p3 = b;
int* p4 = &b[5];
printf("p3=%p\n", p3);
printf("p4=%p\n", p4);
printf("p4-p3=%d\n", p4 - p3);
printf("*p3=%d\n", *p3);
printf("*p4=%d\n", *p4);
printf("*p4-*p3=%d\n", *p4 - *p3);
return 0;
}
运行结果
从结果可以分析出:
相减所得到的差并不是两个地址的差,而是这两个地址的差除以 sizeof()的数据类型,也就是在两个地址中间有几个这种数据类型的东西。char 类型地址差是 5,所以相减的结果是 5(char 类型占1个字节);int 类型地址差是 20,所以相减的结果是 5(int 类型占4个字节)
五、void*
int* p = &i;
void* q = (void*)p;
i 是 int 类型,p 和 q 都指向 i,通过 p 看 i 时,认为 i 是 int 类型;通过 q 看 i 时,认为 i 是 void 类型。
六、指针用来做什么?
- 需要传入较大的数据时用作参数
- 传入数组后对数组做操作
- 函数返回不止一个结果
- 需要用函数来修改不止一个变量
- 动态申请的内存
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)