C语言笔记之指针1

1. 指针运算

1.1 算术运算

  • 加减+、-
    指针与整数相加:表示指针指向下个变量。
    指针与整数相减:表示指针指向上个变量。
    指针与指针相减:两个指针的元素间隔个数。
    在这里插入图片描述
  • 自增自减++、–
    指针能够算术运算,必然能够自增自减。
    在这里插入图片描述

在这里插入图片描述

  • *p++/*p--

操作说明

  1. 操作数是指针

  2. 自增自减++--优先级高于解引用*

计算过程

  1. 运算++/--,返回的是p的值(地址),然后p自加/自减。
  2. 运算*,获取p指向的值。

等价于

*p;
p=p+1;
自增自减 相当于
*q++ *(q++)
*q-- *(q--)

  • *++p/*--p

操作说明

  1. 操作数是指针
  2. 前缀自增自减++--和解引用*的结合律是自右向左。
  3. 前缀自增自减++--在解引用*的右边,优先计算。

计算过程

  1. 运算++/--p自加/自减,返回的是p自加/自减后的值(地址)。
  2. 运算*,获取p指向的值。
自增自减 相当于
*++q *(++q)
*--q *(--q)

  • ++*q/--*q
    操作说明
  1. *操作数是指针,前缀自增自减++--操作数是指针指向的值。
  2. 前缀自增自减++--和解引用*的结合律是自右向左。
  3. 解引用*在前缀自增自减++--的右边,优先计算。

计算过程

  1. 运算*,获取p指向的值。
  2. 运算++/--p指向的值自加/自减。
自增自减 相当于
++*q ++(*q)
--*q --(*q)

如果一个表达式里有多个运算符,则先进行优先级比较,先执行优先级高的运算符;如果优先级相同,那就看结合性,根据结合方向来做运算。

在这里插入图片描述

1.2 单位长度

在这里插入图片描述
从上面可以看到,指针的加1减1,地址并非加1减1。

应用范围
指针的算术运算表示在一片连续空间上的移动。
指针的比较运算也是用于一片连续空间的地址比较。
常用于数组等连续内存。

2. 指针类型

  1. 无论指向什么类型,所有指针的大小都是一样的,都是地址的大小。
char* str;
short* ps;
int* pn;
long* pl;
long long* pll;
float* pf;
double* pd;
long double* pld;
  1. 指针类型转换

指向不同类型的指针不能直接相互赋值(特例void*),需要强制类型转换。

char* str = "abcd";
int* p = str;

指针类型转换没有改变指针内的地址,也没有改变指针指向的值,只是改变了移动的单位长度。
在这里插入图片描述

  1. void类型的指针
    void*是一种很特别的指针,表示指向未知类型的指针,并不指定它是指向哪一种类型的数据,而是根据需要转换为所需数据类型。
int n = 0;
int* p = &n;
void* q = p;
int* k = (int*) q;

指针作用小结

  1. 较大数据结构体传入时做参数。
  2. 传入数组后,对数组做操作。
  3. 函数需要多个返回值时,作为返回值参数。
  4. 动态申请内存。
  5. 避免使用未初始化指针、空指针和野指针。
发布了39 篇原创文章 · 获赞 4 · 访问量 706

猜你喜欢

转载自blog.csdn.net/weixin_44718794/article/details/103723896