c语言详解——指针上(指针与指针变量)

本文详细介绍了C语言中指针的概念,包括指针与指针变量的定义、初始化,以及指针的运算、关系运算和多级指针的应用实例,强调了指针在内存管理、数据传递和间接访问中的重要性。
摘要由CSDN通过智能技术生成

指针是C语言中一个重要概念,是一种数据类型,也是从语言的精华所在!利用指针可以有效地表示复杂的结构;实现内存的动态分布;方便使用字符串;有效而方便的使用数组;在调用函数时能返回多个值;能直接处理内存单元地址;对变量的间接访问等。

1.指针与指针变量

1.1指针和指针变量的概念

为了说清楚什么是指针,首先必须弄清楚“数据在内存中是如何存储”这一问题。CPU只能访问内存中程序指令和数据,也即是程序运行时的指令和数据必须事先装入内存。因此在程序中定义的变量,程序在运行时系统会为每一个变量分配一定的内存空间,内存空间的的大小取决于变量的类型,单位字节,eg:char类型变量分配一个字节,int和float类型变量分配4个字节。

内存是以字节为单位的一片连续的存储空间,为了方便访问,CPU给每个字节一个编号即地址,利用地址来区分不同的内存单元。

上面的图解意思就是把22FE44到22FE47之间四个字节分配给c,把22FE48到22FE4B之间的四个字节分配给b,把22FE4C到22FE4F之间的四个字节分配给a。

在程序中一般是通过变量名来访问内存单元,如输入scanf("%d",&a);执行该语句时,通过键盘输入数据到输入缓冲区,程序从输入缓冲区读入一个数据送入变量a所分配的内存空间中即22FE4C到22FE4F,如有语句printf("%d",a);执行时根据变量名找到对应地址(22FE4C到22FE4F),然后取出数据,送到显示器上输出。

1.1.1间接访问

如下面的代码就是通过间接访问改变变量a的值。

int a, * p = &a;
a = 12;
*p = 24;
printf("%d %d", a, *p);//a=24,*p=24

特殊变量p用来存放a的地址,假如a的地址为004000,内存也为p分配空间地址为005000,通过p访问a的值,先从p的空间005000中读出p的值004000,即a的地址,然后再从004000-004003中取出a的值,通过p变量访问a的值就是间接访问。

1.1.2直接访问

例如上面的scanf和printf就是直接访问a的地址。

ps:按变量名访问内存,实际上仍是通过变量的地址进行访问的,因此我们前面编程时,对变量的操作,实际上是对变量的存储单元进行操作的。

1.2指针变量的定义与初始化

为了表示指针变量和它所指向的变量之间的联系,在程序中用“*”符号来表示“指向”,也即是间接访问。

1.2.1指针变量的定义

与其他变量一样,指针变量仍遵循先定义后使用的原则,其形式为:

数据类型标识符 *指针变量名

说明:

(1)“*”表示其后面的变量名为指针类型。

(2)“数据类型标识符 ”是定义指针变量所指向的目标变量的数据类型,也称指针变量的类型。

eg:int *p;char *p1;第一条语句表示p为指针变量,类型为int型;第二条语句表示p1为指针变量,类型为char型。

因此我们可以知道指针变量只能指向此类型的目标变量即只能将此类型的变量的地址赋给该指针变量。

ps:在定义指针变量时,系统为指针变量分配空间,但是不论指针变量是什么类型,指针变量都是用来存放内存地址的,因此所有的指针变量,系统给它分配的内存空间都是相同的,和定义指针的类型无关.

1.2.2指针变量的引用

要牢记指针变量中只能存地址,虽然地址是整形的值,但是仍然不能将一个整数的值赋给指针变量。

两个与指针变量有关的运算符

(1)&:取地址运算符

(2)*:指针运算符(间接访问运算符)取其指向的变量的值。

ps:*与&具有相同的优先级,结合方向从右到左,因此*&a=a,&*p=p

1.2.3指针变量的初始化

指针变量必须先赋值后使用,因为指针变量被定义后,它的值是不确定的(称这时的指针变量为悬挂(空)指针),它将会指向一个未知的目标(内存空间)。若此时对指针变量间接访问,有可能改变了一些不该(不能)改动的数据,从而产生一系列错误。若指向的是操作系统代码空间,则改变的是操作系统,会对系统造成危险。因此使用指针编程时,为了安全使用指针变量,在定义时,必须赋给它一个确定的地址,即指针的初始化。如果在编程时,不能确定指针指向哪一个变量,在定义时可以初始化指针为“空”,即“空”(NULL,在stdio.h中定义了其值为0,地址也为0,但是这个地址是不可以使用的,读取该地址会报错)赋给指针变量。

1.3指针的运算

1.3.1指针的赋值运算

(1)将一个变量的地址赋给指针变量,是指针变量指向该变量。


	int a, b, * p1, * p2;
	a = 10;
	b = 20;
	p1 = &a;
	p2 = &b;

(2)相同类型指针变量间的赋值

int a = 5, * p1 = &a, * p2;
p2 = p1;

这种赋值后,指针变量所指向的空间关系如下图:

(3)给指针变量赋空值

pa=NULL;这里指针pa并非指向0单元,而是有一个具体的空值,表示pa不指向任何变量。

ps:即使知道变量a的地址是2000,仍不能将2000赋给指针变量pa(pa=2000),而只能将&a赋给整形的指针变量pa(pa=&a)。但是对于全局变量和局部静态指针变量,在定义时若为初始化,则自动初始化为“空指针”。

1.3.2指针的运算

指针的乘除运算时无意义的,且指针与指针相加也是无意义的,因此指针只能加(减)一个整数n,加减运算的结果并不是指针变量的值(地址)加减n,而是与指针变量所指对象的数据类型有关。指针变量的值(地址)应增加(减少)“n*sizeof(指针类型)” 

指针的运算有下列几种:

1.3.3指针的关系运算

指针变量与其他变量一样,可以进行关系比较运算。允许两个指针变量进行所有的关系运算。

说明:

(1)指针的关系运算是将指针变量的值(地址)进行比较,所以将将两个指针变量进行比较时,一定要给指针变量赋值。

(2)指针变量与一个整型数据比较是没有意义的。

  (3)只有相同类型的两个指针变量才可以进行比较(关系运算),NULL可以与任何类型的指针进行==,!=运算,用来判断指针变量是否为空。

1.4多级指针

多级指针是用来保存一个指针变量的地址的,下面以二级指针为例,多级指针也是如此。

1.4.1二级指针变量的定义形式

数据类型标识符 **指针变量名

说明:

(1).其中“** 指针变量名”相当于*(*指针变量名),在括号内定义了一个指针变量,括号外的*,说明指针变量(二级指针)的目标变量是一级指针。

(2).数据类型标识符说明目标变量(一级指针)指向的变量的数据类型。

1.4.2二级指针变量初始化

int a,*p,**pp;

1.4.3二级指针应用

变量a的访问方式(直接访问,一次间接访问,二次间接访问)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a = 100, * p, ** pp;
	p = &a;
	pp = &p;
	printf("%d\n", a);
	printf("%d\n", *p);
	printf("%d\n", **pp);
	return 0;
}

*p代表其所指向的变量a,所以输出100,**pp可以看作*(*pp),*pp代表p,所以*(*pp)等价于*p,也指向a,所以输出也为100.

指针上的内容就到这里啦,咱们下次见哦!

  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: "C语言指针详解.pdf" 是一份详细介绍C语言指针概念和使用的PDF文档。C语言中,指针是一种特殊的变量类型,用于存储其他变量的内存地址。 该PDF文档首先详细介绍了指针的定义和声明。指针的声明需要指定指针变量的类型和名称,并使用星号(*)来表示该变量是一个指针指针变量名的前面加上一个星号,可以获取所指向的变量的值,这被称为"解引用"。 文档还介绍了指针的运算。指针可以进行自增和自减运算,指针之间可以进行相减操作,返回的结果表示它们之间的距离或者偏移量。此外,还可以将指针赋值给另一个指针,或者将指针赋值给一个变量,反之亦然。 除了基本的指针概念,文档还详细介绍了指针的常见应用场景。这包括指针作为函数参数,用于在函数内部对传入的变量进行修改。还有通过指针来实现动态内存分配和释放,以及使用指针实现数据结构(如链表和树)等。 此外,该文档还包含一些常见的指针错误和问题的解决方案。这些错误包括空指针引用、野指针引用以及内存泄漏等。文档指出了这些错误的影响以及如何避免它们。 总的来说,"C语言指针详解.pdf" 是一份详细介绍C语言指针概念、使用和常见问题解决方案的文档,对于学习和理解C语言指针的人们是一份宝贵的资料。 ### 回答2: 《C语言指针详解.pdf》是一本关于C语言指针的详细解析的电子书。在这本书中,作者详细介绍了C语言指针的概念、用途和基本语法。 首先,指针C语言中非常重要的概念,它是一种数据类型,用于存储和操作内存地址。指针可以指向各种数据类型,如整数、字符、数组和结构体等。 在《C语言指针详解.pdf》中,作者详细讲解了指针的声明和初始化,以及如何通过指针来访问和修改变量的值。作者还介绍了指针与数组的关系,以及指针和函数之间的关联。 此外,书中还涵盖了指针的高级应用,如指针的算术运算、指向指针指针指针数组等。作者通过丰富的例子和代码来帮助读者理解这些概念和技巧。 《C语言指针详解.pdf》不仅适合C语言初学者,也适合有一定编程基础的读者。通过阅读此书,读者将能够更深入地理解C语言指针的功能和用法,掌握指针在编程中的灵活运用。 总之,《C语言指针详解.pdf》是一本内容详尽且易于理解的C语言指针教程。读者通过阅读此书,可以提高自己在C语言编程中的指针应用能力,从而更好地实现程序的设计和开发。 ### 回答3: 《C语言指针详解.pdf》是一本介绍C语言指针概念和使用方法的详细手册。C语言中的指针是一种非常重要和特殊的数据类型,它提供了直接访问内存地址的能力,使得C语言具有了更高的灵活性和效率。 这本手册首先会介绍指针的基本概念,包括指针变量的定义和声明、指针的初始化和赋值。它会详细讲解指针变量之间的关系,以及指针的运算规则和使用方法。读者可以学习到如何通过指针操作变量的值和地址,以及如何利用指针实现函数的参数传递和返回值。 接下来,手册会介绍指针和数组之间的关系。C语言中,数组名本质上是一个指向数组首元素的常量指针,因此可以通过指针来操作数组。手册将详细讲解指针和数组的指针算术运算,以及指针和多维数组的关系。 此外,手册还会介绍指针和字符串之间的关系。C语言中,字符串本质上是以空字符结尾的字符数组,可以通过指针来操作字符串。手册将详细讲解指针和字符串的操作,包括字符串的输入输出、字符串的比较和拷贝。 最后,手册还会介绍指针和结构体之间的关系。C语言中,结构体是用户自定义的复合数据类型,可以通过指针来操作结构体。手册将详细讲解指针和结构体的操作,包括结构体指针的定义和使用,以及结构体指针作为函数参数的传递方式。 总之,《C语言指针详解.pdf》是一本深入浅出的指针教程,对于想更深入理解C语言指针的读者来说,是一本非常实用的参考书。无论是初学者还是有一定基础的读者,都可以从中获得很多宝贵的知识和技巧。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值