指针运算

举报
吴梦青 发表于 2022/06/06 08:05:22 2022/06/06
【摘要】 利用*p++遍历数组,0地址的知识点,指针的类型。

*p++

  • 取出p所指的那个数据来,完事之后顺便把p移到下一个位置去
  • *的优先级虽然高,但是没有++高
  • 常用于数组类的连续空间操作
  • 在某些CPU上,这可以直接被翻译成一条汇编指令,会跑的比较快

循环遍历一个数组

#include <stdio.h>
int main(void) {
	char ac[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,};
	char *p = &ac[0];
	int i;
	for (i = 0; i < sizeof(ac) / sizeof(ac[0]); i++) {
		printf("%d\n", ac[i]);
	}
	int ai[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,};
	int *q = ai;
	return 0;
}

用指针遍历数组

在数组里放入一个特数值,比如说-1。

#include <stdio.h>
int main(void) {
	char ac[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1};
	char *p = &ac[0];
	int i;
	for (p = ac; *p != -1; p++) {
		printf("%d\n", *p);
	}
	int ai[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,};
	int *q = ai;
	return 0;
}

用while控制循环

#include <stdio.h>
int main(void) {
	char ac[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1};
	char *p = &ac[0];
	int i;
	while (*p != -1) {
		printf("%d\n", *p++);
	}
	int ai[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,};
	int *q = ai;
	return 0;
}

个人感觉用while写代码看起来更简练一些,而且逻辑上也没有for那么复杂

指针比较

  • 指针不做乘除,因为指针做乘除没有意义
  • <,<=,==,>,>=,!=都可以对指针做
  • 比较它们在内存中的地址
  • 数组中的单元的地址肯定是线性递增的

0地址

  • 当然你的内存中有0地址,但是0地址通常是个不能随便碰的地址
  • 所以你的指针不应该具有0值
  • 因此可以用0地址来表示特殊的事情:
    • 返回的指针是无效的
    • 指针没有被真正初始化(先初始化为0)
  • NULL是一个预定定义的符号,表示0地址
    • 有的编译器不愿意你用0表示0地址
    • 以后最好用NULL表示0地址,虽然在有的编译器他们两个可能不相等

指针的类型

  • 无论指向什么类型,所有的指针的大小都是一样的,因为都是地址
  • 但是指向不同类型的指针是不能直接互相赋值的
  • 这是为了避免用错指针
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。