【指针专题】

本文详细介绍了指针的概念、使用方法,包括指针指向变量、数组、字符串,以及在函数参数传递、多级指针、自增自减和const限制的应用。通过实例演示了指针操作的技巧和注意事项。
摘要由CSDN通过智能技术生成

【指针专题】


前言

介绍指针的定义与使用,指针访问变量,数组,字符串,涉及多级指针,指针与const结合


一、指针的定义

  1. 指针是表示内存地址的一种低级数据类型,通俗讲,指针即地址。
  2. “ * ”运算符有多重含义,需要区分:可以用 “ * ” 来定义指针,可以用 “ * ” 做乘法运算 ,也可以是解引用 " * "。
  3. 定义指针的一般类型:
    [存储类型] 数据类型 *指针1,*指针2,…;

二、指针的使用

1.指针指向变量并访问

  • 定义一级指针指向变量,
  • 定义二级指针指向一级指针(间接指向变量)
  • 解引用的运用:通过一级指针和二级指针修改变量值
    定义三级指针(多级指针)修改一级指针的指向

代码如下(示例):

//基本定义与使用
	double a=1.0, b=2.2;
	double* pa = &a, * pb = &b;
	double** ppa= &pa, ** ppb = &pb;
	**ppa = 9.9;
	printf("a=%.1f\n", **ppa);

	*ppb =&a ;		//或者  pb=&a	//通过ppb指向pb的指向a
	printf("a=%.1f\n", **ppb);
	double *** s=&ppa;
	**s = &b;				//通过s修改pa的指向 指向b
	printf("b=%.1f\n", ***s);

2.指针与数组 字符串 结合

  • 指针访问一维数组,先定义指向一维数组的指针

  • 指针p指向数组arr的首地址,p+i就是数组元素arr[i]的地址,通过对这些地址施加 * 或[ ]运算则可以访问数组中元素中的数据

代码如下(示例):

	int arr[] = { 1,2,3,4,5 };
	int* p = arr;  //int *p=&arr[0];

	const char* pstr = "hello";

3.指针与函数参数的运用

  • 函数形参使用指针,可将函数结果带出
    如形参int* sum可将求和结果返回到主函数

代码如下(示例):

//实现一个函数Getsum()  返回值为void  实现1+2+3+4+....
//并将求和结果在main中打印出来
void GetSum(int n, int* sum)
{
	//法一 *sum=(1 + n)* n / 2;   //求和公式
	
	//法二
	*sum=0;
	for(int i = 1; i <= n; i++)
	{
		*sum+= i;
	}

	/*  法三
	int s=0;
	for(int i=1;i<=n;i++)
	{
		s+=i;
	}
	*sum=s;
	*/
}
  • 函数形参使用指针,影响实参
    如交换函数使用形参

代码如下(示例):

#inlcude<stdio.h>

void Swap1(int* a, int* b)			//形参  栈内开辟空间
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

void Swap2(int a ,int b)
{
	int temp;
	temp=a;
	a=b;
	b=temp;
}

int main()
{
	int a=2,b=3;
	Swap2(a , b);
	printf("%d %d ",a,b);	// 2  3
	Swap1(&a, &b);
	printf("%d %d ",a,b);	// 3  2
}


4.多级指针

  • 基本定义与使用
    代码如下(示例):
#include<stdio.h>
int main()
{
	//基本定义与使用
	double a=1.0, b=2.2;

	double* pa = &a, * pb = &b;
	double** ppa= &pa, ** ppb = &pb;
	**ppa = 9.9;
	printf("a=%.1f\n", **ppa);

	*ppb =&a ;		//或者  pb=&a	//通过ppb指向pb的指向a
	printf("a=%.1f\n", **ppb);
	double *** s=&ppa;
	**s = &b;				//通过s修改pa的指向 指向b
	printf("b=%.1f\n", ***s);
}
	

5.指针自加与自减

  • 指针加一 偏移量 访问元素

代码如下(示例):

*/
#include<stdio.h>
#include<string.h>

void Show(int* p, int n)
{
	//法一
	printf("指针指向首元素不动,利用偏移量输出:");
	for (int i = 0; i < n; i++)
	{
		printf("%d ", *(p + i));
	}
	//法二
	printf("\n使用指针加一,利用指针指向每一个元素输出:");
	for (int i = 0; i < n; i++)
	{
		/*printf("%d ", *p);
		p++;*/
		printf("%d ",*p++);
	}
	printf("\n\n");
}


	
int main()			//栈区  函数局部变量
{
	int ar[] = { 1,2,3,4,5 };
	//int* p = arr;  //int *p=&arr[0];
	int n = sizeof(ar) / sizeof(ar[0]);
	Show(ar, n);
}


6.指针与const结合的运用

  • const 与一级指针结合

const int* p=&val;
const 限定*p; 不能通过p修改所指之物的值

int* const p=&val;
const 限定p; 不能修改p的指向,可以通过p修改所指之物的值

代码如下(示例):

#include<stdio.h>
#include<string.h>

size_t mystrlen(const char* p)
{
	size_t count = 0;
	while (*p!='\0')
	{
		count++;
		p++;
	}
	return count;
}
	
int main()			//栈区  函数局部变量
{
	const char* pstr = "hello";
	size_t i = mystrlen(pstr);
	printf("长度:lenght_*pstr=%d\n\n",i );
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值