C 语言(5)

5.指针

5.1 指针和指针变量

变量的指针就是变量的地址。存放变量地址的变量是指针变量。

5.2 指针运算符

两个有关的运算符:

1)  &:取地址运算符。单目运算符,其结合性为自右至左,其功能是取变量的地址。

2)  *:指针运算符(或称“间接访问” 运算符)。单目运算符,其结合性为自右至左,用来表示指针变量所指的变量。

5.3 指针变量的运算

1)  赋值运算:指针变量的赋值运算有以下几种形式。

① 指针变量初始化赋值。

② 把一个变量的地址赋予指向相同数据类型的指针变量。

③ 把一个指针变量的值赋予指向相同类型变量的另一个指针变量。

④ 把数组的首地址赋予指向数组的指针变量。例如:int a[5], *pa;pa=a; 也可写为: pa=&a[0];

⑤ 把字符串的首地址赋予指向字符类型的指针变量。例如:char *pc;  pc="C Language"; 或 char *pc="C Language";

⑥ 把函数的入口地址赋予指向函数的指针变量。例如:int (*pf)(); pf=f; /*f为函数名*/

2)  加减算术运算

 指针变量的加减运算只能对数组指针变量进行,对指向其它类型变量的指针变量作加减运算是毫无意义的。

3)  两个指针变量之间的运算:只有指向同一数组的两个指针变量之间才能进行运算,否则运算毫无意义。

对指针变量赋 0 值和不赋值是不同的。指针变量未赋值时,可以是任意值,是不能使用的。否则将造成意外错误。而指针变量赋 0 值后,则可以使用,只是它不指向具体的变量而已。

5.4 数组指针

如果指针变量 p 已指向数组中的一个元素,则 p+1 指向同一数组中的下一个元素。

引用一个数组元素可以用:

1)  下标法,即用a[i]形式访问数组元素。指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价。

2)  指针法,即采用*(a+i)或*(p+i)形式,其中a是数组名,p是指向数组的指针变量。

注意的问题:

1)  指针变量可以实现本身的值的改变。如 p++ 是合法的;而 a++ 是错误的。因为 a 是数组名,它是数组的首地址,是常量。

2)  *p++,由于 ++ 和 * 同优先级,结合方向自右而左,等价于 *(p++)

5.5 字符串指针

用字符数组和字符指针变量都可实现字符串的存储和运算。但是两者是有区别的。在使用时应注意以下几个问题:

字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以 ‘\0’ 作为串的结束。字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。

对字符串指针方式

char *ps="C Language";

可以写为:

char *ps;

ps="C Language";

而对数组方式:

static char st[]={"C Language"};

不能写为:

char st[20];

st={"C Language"};

而只能对字符数组的各元素逐个赋值。

5.6 函数指针

函数指针变量定义的一般形式为:类型说明符 (*指针变量名)();

其中“类型说明符”表示被指函数的返回值的类型。“(* 指针变量名)” 表示 “*” 后面的变量是定义的指针变量。最后的空括号表示指针变量所指的是一个函数。

例如: int (*pf)();

指针型函数

定义指针型函数的一般形式为:

 类型说明符 *函数名(形参表)

 {

 ……  /*函数体*/

 }

其中函数名之前加了 “*” 号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。

函数指针变量和指针型函数这两者在写法和意义上的区别。如 int(*p)() 和 int *p() 是两个完全不同的量。

int (*p)() 是一个变量说明,说明p是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p) 的两边的括号不能少。

int *p() 则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整型量的指针,*p 两边没有括号。作为函数说明,在括号内最好写入形式参数,这样便于与变量说明区别。

对于指针型函数定义,int *p() 只是函数头部分,一般还应该有函数体部分。

5.7  指针数组

指针数组说明的一般形式为: 类型说明符 *数组名[数组长度]

5.8 指向指针的指针

如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。

5.9 Void 类型的指针

可以定义一个指针变量,但不指定它是指向哪一种类型数据。

5.10 有关指针的数据类型和指针运算的小结

5.10.1 有关指针的数据类型的小结

定义

含义

int i;

定义整型变量 i

int *p

P 为指向整型数据的指针变量

int a[n];

定义整型数组 a,它有 n 个元素

int *p[n];

定义指针数组 p,它由 n 个指向整型数据的指针元素组成

int (*p)[n];

p 为指向含 n 个元素的一维数组的指针变量

int f();

f 为带回整型函数值的函数

int *p();

p 为带回一个指针的函数,该指针指向整型数据

int (*p)();

p 为指向函数的指针,该函数返回一个整型值

int **p;

p 是一个指针变量,它指向一个指向整型数据的指针变量

 5.10.2 指针运算的小结

现把全部指针运算列出如下:

1)  指针变量加(减)一个整数:

例如:p++、p--、p+i、p-i、p+=i、p-=i

一个指针变量加(减)一个整数并不是简单地将原值加(减)一个整数,而是将该指针变量的原值(是一个地址)和它指向的变量所占用的内存单元字节数加(减)。

2)  指针变量赋值:将一个变量的地址赋给一个指针变量。

p=&a;  (将变量 a 的地址赋给 p)

p=array;  (将数组 array 的首地址赋给 p)

p=&array[i];  (将数组 array 第 I 个元素的地址赋给 p)

p=max;  ( max 为已定义的函数,将 max 的入口地址赋给 p)

p1=p2;  ( p1 和 p2 都是指针变量,将 p2 的值赋给 p1)

注意:不能如下:p=1000;

  • 指针变量可以有空值,即该指针变量不指向任何变量: p=NULL;
  • 两个指针变量可以相减:如果两个指针变量指向同一个数组的元素,则两个指针变量值之差是两个指针之间的元素个数。

两个指针变量比较:如果两个指针变量指向同一个数组的元素,则两个指针变量可以进行比较。指向前面的元素的指针变量“小于” 指向后面的元素的指针变量。

posted @   码上领航者  阅读(34)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示