指针的基本用法、指针的运算

本文详细介绍了C语言中指针的基本概念和用法,包括指针的作用、地址与变量的关系、指针声明与初始化、指针运算等。通过实例展示了指针如何动态分配内存、表示复杂数据结构以及获取多个函数返回值。同时,讲解了指针的算术运算,如加减操作、与地址的关系,并提供了相应的代码示例进行解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指针的基本用法

  • 1.掌握指针的基本用法

  • 2.总结与思考

指针的作用

  • 使程序简洁、紧凑、高效

  • 有效的表示复杂的数据结构

  • 动态分配内存

  • 得到多余一个的函数返回值

地址和变量

  • 在计算机内存中,每一个字节单元,都有一个编号,称为地址。

  • 在C语言中,内存单元的地址称为指针,专门用来存放地址的变量,称为指针变量。

  • 在不影响理解的情况下,有时对地址、指针和指针变量不区分,统称指针。

一般形式如下: <存储类型> <数据类型> *<指针变量>
例如:char *P;
指针的存储类型是指针变量本身的存储类型。
指针说明时指定的数据类型不是指针变量本身的数据类型,而是指针目标的数据类型。简称为指针的数据类型。

指针在说明的同时,也可以被赋予初值,称为指针的初始化
一般形式是:
<存储类型> <数据类型> *<指针变量名> = <地址量>;
例如:int a,*p = &a;
是把变量a的地址作为初始值赋予了定义的int类型的指针p。
例:

#include<stdio.h>
int main()
{
	int a = 10;
	int *p;
	p = &a;
	//打印指针p的地址以及指针p的长度
	printf("&p = %p %d\n",&p,sizeof(p));
	printf("%p\n%p\n",&a,p);
	return 0;
}

运行结果:

&p = 0x7ffed3c557b0 8
0x7ffc10ecbbcc
0x7ffc10ecbbcc

指针指向的内存区域中的数据称为指针的目标
如果它指向的区域是程序中的一个变量的内存空间,则这个变量称为指针的目标变量,简称为指针的目标。

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

运行结果:

10  10

*p的值是10,即变量a是指针p的目标变量,10是指针p的目标,也可以说是指针变量p所指向的a的地址上的值。
引入指针要注意程序中的p、*p、&p三种表示方法的不同意义。设p是一个指针,则:

  • p——指针变量,它的内容是地址量。

  • *p——指针所指向的对象,它的内容是数据。

  • &p——指针变量占用的存储区域的地址,是个常量。

总结与思考

  • 什么叫指针?
    指针就是内存地址,即内存以地址进行编号,这个编号就是指针。

  • 指针占几个字节?指针占几个字节与语言无关,而是跟系统的寻址能力有关,例如16位系统,就占两个字节,32位系统占4个字节,64位系统占8个字节。

指针的运算

  • 指针运算是以指针变量所存放的地址量作为运算量而进行的运算

  • 指针运算的实质就是地址的计算

  • 指针运算的种类是有限的,它只能进行赋值运算、算术运算、关系运算。

指针的算术运算

指针算术运算见下表:

运算符计算形式意义
+p+n指针向地址大的方向移动n个数据
-p-n指针向地址小的方向移动n个数据
++p或p指针向地址大的方向移动1个数据
--p--或--p指针向地址小的方向移动1个数据
-p-px两个指针之间相隔元素的个数

指针相加运算
例:

#include<stdio.h>
int main()
{
	int a = 10;
	int *p;
	double b = 5, *q;
	p = &a;
	q = &b;
	
	//P指针的地址和p指针地址+2的地址
	printf(" %p %p\n",&p,p+2);
    //P指针的地址和p指针地址+2的地址
	printf(" %p%p\n",&q,q+2);
	
	return 0;
}

运算结果:

0x7ffe30e87220 0x7ffe30e87224
0x7ffe30e87230 0x7ffe30e87238

指针相减运算

  • p-q运算的结果是量指针指向的地址位置之间间隔数据的个数。因此,两指针相减不是两指针持有的地址相减的结果。

  • 两指针相减的结果值不是地址量,而是一个整数值,表示两指针之间相间隔数据的个数。
    例:

#include<stdio.h>
int main()
{
	int a[5]= {1,2,3,4,5};
	int *p,*q;
	p = a;
	q = &a[3];
	printf("%p %p\n",p,q);
	printf("%d %d\n",*p,*q);
	printf("%ld\n",q-p);/*指针相减*/
	return 0;
}

运算结果:

0x7ffcfa0a8140 0x7ffcfa0a814c
1 4
3

指针加加(p++)、指针减减(p--)

  • 是地址的加1、减1操作。

指针的关系运算符

运算符说明例子
>大于px>py
<小于px<py
>=大于等于px>=py
<=小于等于px<=py
!=不等于px!=py
==等于px==py
  • 两指针之间的运算关系表示它们指向的地址位置之间的关系。指向地址大的指针大于指向地址小的指针。

  • 指针与一般整数变量之间的关系运算没有意义。但可以和零进行等于或不等于的关系运算,判断指针是否为空。

例:

#include<stdio.h>
int main()
{
	int *p = NULL;
	/*指针和零比较判断指针是否为空*/
	if(p == 0)
	    printf("%d %p\n",p,p);
	return 0;
}

运行结果:

0 (nil)

0表示指针为空,nil表示无,任何变量在没有被赋值之前的值都为nil。

### C语言指针基本用法 #### 什么是指针指针是一种特殊的变量,它存储的是内存地址而不是具体的数值。通过指针可以访问和操作该地址所对应的内存单元中的数据。 #### 定义指针 要定义一个指针变量,需指定其指向的数据类型。例如: ```c int *p; ``` 上述语句表示 `p` 是一个指向整数类型的指针[^1]。 #### 初始化指针 未初始化的指针可能是一个野指针,这可能导致程序崩溃或其他不可预测的行为。可以通过将指针设置为空(NULL)来避免这种情况: ```c int *p = NULL; ``` #### 使用指针访问变量 假设有一个整型变量 `a` 和一个指向它的指针 `p`,如下所示: ```c int a = 10; int *p = &a; // 将变量a的地址赋值给指针p printf("Value of a is %d\n", *p); // 输出*p的结果即为a的值 ``` 这里 `&a` 表示取变量 `a` 的地址,而 `*p` 则是对指针解引用以获取其所指向的内容[^2]。 #### 数组与指针的关系 在C语言里,数组的名字实际上就是一个常量指针,代表了这个数组首元素的位置。比如下面的例子展示了如何利用指针遍历整个数组: ```c #include <stdio.h> int main(){ int arr[] = {1, 3, 5}; int n = sizeof(arr)/sizeof(int); int *ptr = arr; for(int i=0;i<n;i++){ printf("%d ", *(ptr+i)); } } ``` 此代码片段说明了指针算术运算的概念以及它是怎样帮助我们逐一遍历数组成员的。 #### 防止野指针的方法 为了防止出现野指针的情况,在实际编程过程中应该遵循以下原则之一:始终确保新创建出来的每一个指针都被赋予了一个有效的初始值;或者一旦某个对象不再需要,则立即将任何仍然存在的对该对象的引用置零(设成null)。 #### 函数返回静态局部变量地址 当希望从函数内部传出某些计算结果并让这些结果能够在外部继续存在时,可考虑采用带有static修饰符声明的方式实现这一点。因为普通的自动型局部变量在其所在作用域结束之后就会消失不见,但是加上static关键字以后就可以改变这一性质使得它们即使离开自己的生存期也能保持不变直到程序完全终止为止[^3]。 #### 双重指针概念介绍 除了简单的一级指针外还存在着更复杂的结构形式—双重指针(double pointer),也就是所谓的“指向另一个指针本身的指针”。这样的设计允许程序员间接地修改原始目标位置上的内容而不必直接接触原实体本身。举个简单的例子来说吧: ```c void changePointer(int **pptr){ (*pptr)++; } int main(void){ int var = 8 ; int *iptr =&var ; printf ("Before function call : Value of iptr=%u\n", iptr ); changePointer(&iptr); printf ("After function call : Value of iptr=%u\n", iptr ); return 0;} ``` 在这个案例当中可以看出当我们传入二级指针作为参数传递到子例程changePointer之中去执行加一动作的时候,最终反映到了最顶层的实际变量上面去了[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值