指针 笔记4

一、指针的自加运算

#include <stdio.h>
#include <stdlib.h>
int main(void) {
int ages[] = { 21,15,18,14,23,28,10 };
int len = sizeof(ages) / sizeof(ages[0]);
//使用数组的方式来访问数组
for (int i = 0; i < len; i++) {
printf("第%d 个学员的年龄是:%d\n", i + 1, ages[i]);
}
//打印数组的地址和第一个成员的地址
printf("ages 的地址: 0x%p , 第一个元素的地址: 0x%p\n", ages,&ages[0]);
int* p = ages;
//访问第一个元素
printf("数组的第一个元素:%d\n", *p);
//访问第二个元素
//p++; // p = p+ 1*(sizeof(int))系统默认增加一个类型的字节
//printf("数组的第二个元素:%d, 第二个元素的地址: 0x%p\n", *p, p);
for (int i = 0; i < len; i++) {
printf("数组的第%d 个元素:%d 地址:0x%p\n", i + 1, *p, p);
p++;
}
printf("------------------------\n");
char ch[4] = { 'a','b','c','d' };
char* cp = ch;
for (int i = 0; i < 4; i++) {
printf("数组的第%d 个元素:%c 地址:0x%p\n", i + 1, *cp, cp);
cp++;
}
//总结: p++ 的概念是在 p 当前地址的基础上 ,自增 p 对应类型的大小 p= p + 1 * (sizeof(类型))
system("pause");
return 0;
}

二、指针的自减运算

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* 让用户输入一个字符串,然后反向输出,注意:不能改变原来的字符串!
* 如: "12345" 逆转成 "54321" 输出
*/
int main(void) {
char input[128];
int len;
//char tmp;
scanf_s("%s", input, 128);
len = strlen(input);
//方法一交换
/*
for( int i=0; i<len/2; i++){
tmp = input[i];
input[i] = input[len-i-1];
input[len-i-1] = tmp;
}*/
/*
for(int i=0; i<len; i++){
printf("%c", input[i]);
}*/
//printf("逆转后:%s\n", input);

 

//第二种方法
/*
for(int i=0; i<len; i++){
printf("%c", input[len-i-1]);
}
printf("\n");
*/
//第三种方法
char* p = &input[len - 1];//指向最后一个元素
for (int i = 0; i < len; i++) {
printf("%c", *p--);
}
printf("\n");
system("pause");
return 0;
}

三、指针与整数的加减运算

指针与整数之间的加减运算
//demo8-10.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
int ages[] = {20,18,19,24,23,28,30,38, 35, 32};
int len = sizeof(ages) / sizeof(ages[0]);
int *p = ages;
printf("第 7 个美女的年龄: %d\n", *(p+6));
//printf("*p+6 = : %d\n", *p+6); 优先级,记得加括号
printf("第 3 个美女的年龄: %d\n", *(p+2));
int *p1 = &ages[4];
printf("相对于第 5 个美女,她的前一位的年龄: %d\n", *(p1 -1));
printf("相对于第 5 个美女,她的前三位的年龄: %d\n", *(p1 -3));

system("pause");
return 0;
}

知识点:
 (1 )指针与整数的运算 ,指针加减数字表示的意义是指针在数组中位置的移动;
对于整数部分而言,它代表的是一个元素,对于不同的数据类型,其数组的元素占
用的字节是不一样的,
比如指针 + 1,并不是在指针地址的基础之上加 1 个地址,而是在这个指针地址的
基础上加 1 个元素占用的字节数:
 如果指针的类型是 char*,那么这个时候 1 代表 1 个字节地址;
 如果指针的类型是 int*,那么这个时候 1 代表 4 个字节地址;
 如果指针的类型是 float*,那么这个时候 1 代表 4 个字节地址;
 如果指针的类型是 double*,那么这个时候 1 代表 8 个字节地址。
( 3 )通用公式:
数据类型 *p;
p + n 实际指向的地址:p 基地址 + n * sizeof(数据类型)
p - n 实际指向的地址:p 基地址 - n * sizeof(数据类型)
比如
(1)对于 int 类型,比如 p 指向 0x0061FF14,则:
p+1 实际指向的是 0x0061FF18,与 p 指向的内存地址相差 4 个字节;
p+2 实际指向的是 0x0061FF1C,与 p 指向的内存地址相差 8 个字节
(2)对于 char 类型,比如 p 指向 0x0061FF28,则:
p+1 实际指向的是 0x0061FF29,与 p 指向的内存地址相差 1 个字节;
p+1 实际指向的是 0x0061FF2A,与 p 指向的内存地址相差 2 个字节;

四、指针与指针之间的运算

#include <stdio.h>
#include <stdlib.h>
/**
* (1)使用“指针-指针”的方式计算整数数组元素的偏移值;
* */
int main(void){
int ages[] = {20,18,19,24,23,28,30,38, 35, 32};
int ages1[] = {18, 19, 20, 22};
int len = sizeof(ages) / sizeof(ages[0]);
int *martin = ages+6;
int *rock = ages+9;

printf("rock - martin = %d\n", rock - martin);
printf("martin - rock = %d\n", martin - rock);
martin = ages+6;
rock = ages1+3;
printf("martin: %p rock: %p rock-martin: %d\n", martin, rock ,rock -martin);
system("pause");
return 0;
}

知识点:
(1)指针和指针可以做减法操作,但不适合做加法运算;

(2)指针和指针做减法适用的场合:两个指针都指向同一个数组, 相减结果为两个指针之
间的元素数目,而不是两个指针之间相差的字节数。

比如:int int_array[4] = {12, 34, 56, 78};
int *p_int1 = &int_array[0];
int *p_int2 = &int_array[3];
p_int2 - p_int1 的结果为 3,即是两个之间之间的元素数目为 3 个。

如果两个指针不是指向同一个数组,它们相减就没有意义。

(3)不同类型的指针不允许相减,比如
char *p1;
int *p2;
p2-p1 是没有意义的。

posted @ 2020-05-12 10:22  CollisionDimension  阅读(70)  评论(0编辑  收藏  举报