第8天:指针运算

132 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

*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地址,虽然在有的编译器他们两个可能不相等

指针的类型

  • 无论指向什么类型,所有的指针的大小都是一样的,因为都是地址
  • 但是指向不同类型的指针是不能直接互相赋值的
  • 这是为了避免用错指针