C 指针详解

本文深入探讨了C语言中指针的各种应用,包括算术运算、递增递减、指针比较、指针数组、指向指针的指针、传递指针给函数以及从函数返回指针等核心概念。

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

指针的算术运算

C 指针是一个用数值表示的地址。因此可以对指针执行算术运算。可以对指针进行四种算术运算:++、–、+、-。

如果p是一个指向地址 1000 的整型指针,p++后p将指向1004,因为p 每增加一次,它都将指向下一个整数位置,即当前位置往后移 4 个字节。

递增和递减一个指针

使用指针代替数组,因为变量指针可以递增,而数组不能递增,因为数组是一个常量指针

例如:

#include <stdio.h>

int main ()
{
   int  a[] = {10, 100, 200};
   int  i, *p;

   /* 指针中的数组地址 */
   p = a;
   for ( i = 0; i < 3; i++)
   {

      printf("存储地址:a[%d] = %x\n", i, p );
      printf("存储值:a[%d] = %d\n", i, *p );

      /* 移动到下一个位置 */
      p++;
   }
   return 0;
}

指针的比较

指针可以用关系运算符进行比较,如 ==、< 和 >。如果 p1 和 p2 指向两个相关的变量,比如同一个数组中的不同元素,则可对 p1 和 p2 进行大小比较。

指针数组

想让数组存储指向数据类型的指针。

声明一个指向整数的指针数组

int *p[];

实例:

#include"stdio.h"

void main()
{
	int num[] = {1, 2, 3, 4, 5, 6};
	int i;
	int *p[6];
	for(i = 0; i < 6; i++)
	{
		p[i] = &num[i];
		//&取地址
		//p[i]等于num[i]的地址
		//赋值为整数的地址
	}
	for(i = 0; i < 6; i++)
	{
		printf("%d\t", *p[i]);
		//*指向p[i]的地址
	}
}

指向指针的指针

是一种多级间接寻址的形式,是一个指针连。
一个指针包含一个变量的地址。

当定义了一个指针的指针是,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。

声明的形式如下:

int **ptr;

当一个目标值被一个指针间接指向另一个指针时,访问这个值需要使用两个*号。

实例:

#include"stdio.h"

void main()
{
	int var = 1;
	int *ip;
	int **pip;
	ip = &var;     //ip取var的地址
	pip = &ip;	//pip取ip的地址
	printf("%d\n", **pip);		//**获取pip的值
}

传递指针给函数

实例:

#include"stdio.h"
#include"time.h"
/*
	将指针变量传入函数
	把时间赋值给指向指针变量的值
*/
void getSeconds(unsigned long *ulp)
{
	//获取当前秒数
	*ulp = time(NULL);
}

void main()
{
	unsigned long sec;	//定义一个变量
	getSeconds(&sec);	//将变量的地址传给指针变量
	printf("%ld\n",sec);
}

c语言不支持把数组当作函数的形参,但能用指针代替数组

例如:

#include"stdio.h"
#include"time.h"
float getAvg(int *arr, int size)
{
	int i;
	float avg;
	int sum = 0;
	for(i = 0; i < size; i++)
	{
		sum += arr[i];
	}
	avg = (float) sum / size;
	return avg;
}

void main()
{
	int num[5] = {1, 4, 6, 8, 9};
	float avg;
	avg = getAvg(num, 5);			//传递一个指向数组的指针做参数
	printf("%4.2f\n", avg);
}

从函数返回指针

必须声明一个返回指针的函数

int * myFunction()
{
.
.
.
}

c语言不支持在调用函数时返回局部变量的地址
除非定义局部变量为static变量

如下:

#include"stdio.h"
#include"time.h"
#include"stdlib.h"
//返回一个随机数组的地址
int * getRandom()
{
	static int r[10];
	int i;
	srand((unsigned)time(NULL));
	for(i = 0; i < 10; i++)
	{
		r[i] = rand();
	}
	return r;
}

void main()
{
	int i;
	int *ip;
	ip = getRandom();
	for (i = 0; i < 10; i++)
	{
		printf("%d\t", *(ip + i));
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值