笔记——关于C语言指针的使用以及使用场景


一、指针的定义

定义:指针一般是指指针变量,指针变量的内容存储的是其指向的对象的首地址,指向的对象可以是变量(指针变量也是变量),数组,函数等占据存储空间的实体。

理解:类似于一个有着特定指向的箭头,指针变量即是所指方向。指针本身是一个地址,对指针取地址即是取出该地址上的对应的东西(数字、字符等)。

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int i=1;
	int *p=&i;//此处*p是定义了一个指针变量p
	printf("i的值为:%d\n",i);
	printf("对p取值为:%d\n",*p);//此处*p是一个表达式,*是取值表达式
	printf("i的地址为:0x%08x\n",p);//指针中存放的是i的地址
	system("pause");
	return 0;
}

二、指针的使用场景

1.指针的传递

#include<stdio.h>
#include<stdlib.h>
int change(int j)
{
	j=1;
}
int main()
{
	int i=5;
	printf("before change i=%d\n",i);
	change(i);
	printf("after change i=%d\n",i);
	system("pause");
	return 0;
}
//变量i的值不会发生改变,由于i的地址与j的地址是在两个栈空间内,对i与j的值改变互不影响
#include<stdio.h>
#include<stdlib.h>
int change(int *j)
{
	*j=1;//间接访问得到变量j
}
int main()
{
	int i=5;
	printf("before change i=%d\n",i);
	change(&i);//传递变量i的地址
	printf("after change i=%d\n",i);
	system("pause");
	return 0;
}
//变量i的值会发生改变,由于change函数是对地址进行操作,传递到change函数中的正是i的地址

理解:即利用函数修改main函数中的数值时,需要利用指针的传递对地址进行操作。栈空间是不同的,但是想要修改的数的地址是唯一的,对该地址进行间接操作以达到修改main函数中数值的目的。

2.指针的偏移

代码如下(示例)——服务于一维数组:

#include<stdio.h>
#include<stdlib.h>
#define N 5
int main()
{
	int a[N]={1,10,100,1000,10000};
	int *p,i;
	p=a;//其实是p=&a[0],让p指向数组中第一个元素
	for(i=0;i<N;i++)
	{
		printf("%d ",*(p+i));
	}
	printf("\n");
	p=&a[4];//让p指向数组中最后一个元素
	for(i=0;i<N;i++)
	{
		printf("%d ",*(p-i));
	}
	system("pause");
	return 0;
}
//将指针指向数组的任意一个元素,对指针变量进行加减也即是对指向元素数组的角标进行相应的加减

理解:指针作为箭头,当它指向数组内的某个位置时,根据数组连续存放的特性,对指针变量进行加减操作也相当于是对数组角标进行加减操作,所以一一对应之后输出相应的数值

3.二级指针的传递

二级指针:指针变量的内容存储的是某个一级指针的地址值。

#include<stdio.h>
#include<stdlib.h>
//当在子函数中修改主函数某一个一级指针的变量的值需要用到二级指针
void change1(int **p2,int *pj)
{
	*p2=pj;
}
int main()
{
	int i=10,j=5;
	int *pi=&i,*pj=&j;//把该变量的地址值传给子函数
	int **p2;
	printf("before: i=%d,j=%d,*pi=%d,*pj=%d\n",i,j,*pi,*pj);
	change1(&pi,pj);
	printf("after: i=%d,j=%d,*pi=%d,*pj=%d\n",i,j,*pi,*pj);
	system("pause");
}

3.二级指针的偏移

代码如下(示例)——二级指针服务于指针数组:
可用于索引排序

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 5
void print(char **p2,int len)
{
	int i;
	for(i=0;i<len;i++)
	{
		puts(p2[i]);

	}
}
int main()
{
	char b[5][10]={"zhangsan","lisi","wangmazi","zhaoliu","qianqi"};
	char *p[N];//二级指针(指针数组名里存的是二级指针)
	//char **p2;
	char *tmp;//排序用的中间变量值
	int i,j;
	//p2=p;
	for(i=0;i<N;i++)
	{
		p[i]=b[i];
	}
	printf("before sort\n");
	for(i=0;i<N;i++)
	{
		puts(p[i]);
	}
	printf("----------------------\n");

	for(i=5;i>1;i--)//冒泡排序,字符串比较用strcmp
	{
		for(j=0;j<i-1;j++)
			if(strcmp(p[j],p[j+1])>0)
			{
				tmp=p[j];
				p[j]=p[j+1];
				p[j+1]=tmp;
			}
	}
	printf("after sort\n");
	print(p,5);
	printf("----------------------\n");
	printf("original state\n");
	for(i=0;i<N;i++)
	{
		puts(b[i]);
	}
	system("pause");
	return 0;
}

4.函数指针

通过函数指针可以将某种行为传递给一个函数,这样可以调用函数a达到执行函数b行为的目的。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//定义函数指针,初始化只能赋函数名
void a(void (*p)())
{
	p();
}
void b()
{
	printf("I am function b\n");
}
int main()
{
	void (*p)();//定义了一个函数指针变量,用于存储函数的入口地址
	p=b;//函数指针的返回值一级入参要与函数保持一致
	a(b);//传递一种行为
	system("pause");
	return 0;
}

个人理解:定义函数指针变量,存储函数,利用指针实现间接调用。

5.练习题

用指针实现将包含字符数字的字符串分开,使得分开后的字符串前一部分是数字后一部分是数字,后一部分是字母; 如:
h1ell2o4 ——>124hello
w2or36l4d6 ——>23646world


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

C语言指针C语言非常重要的概念,它是程序设计最基本的数据结构之一。指针可以用于在程序访问和操作内存的数据,它们是C语言最强大、最灵活的工具之一。在本篇笔记,我们将介绍C语言指针的基本概念和用法。 1. 指针的概念 指针是一个变量,它存储了一个内存地址。在C语言,每个变量都有一个内存地址,指针可以用来指向这个地址。通过指针,我们可以访问和操作内存的数据,这使得C语言非常灵活和强大。 2. 定义指针变量 在C语言,定义指针变量有两个步骤。第一步是声明指针变量的类型,第二步是用"&"符号取得一个变量的地址,并将这个地址赋给指针变量。例如: ```c int num = 10; //定义一个整型变量num int *p; //声明一个指针变量p p = &num; //将num的地址赋给指针变量p ``` 这样,指针变量p就指向了变量num的地址。 3. 操作指针变量 有了指针变量之后,我们可以通过指针变量访问和操作内存的数据。例如,要访问变量num的值,可以通过指针变量p来实现: ```c printf("num的值为:%d", *p); //输出num的值 ``` 在这个例子,通过"*"符号来访问指针所指向的内存存储的值。这个符号被称为“解引用符号”,它可以用来访问指针所指向的内存存储的值。 4. 指针的运算 指针可以进行加、减运算,这种运算是基于指针的类型和指针所指向的内存的大小进行的。例如,如果定义了一个指向整型的指针变量p,那么p+1将指向下一个整型变量的地址。同样的,p-1将指向上一个整型变量的地址。 此外,指针还可以用来访问数组的元素。例如: ```c int arr[5] = {1, 2, 3, 4, 5}; //定义一个整型数组 int *p; //声明一个指针变量 p = arr; //将数组的首地址赋给指针变量 printf("arr[0]的值为:%d", *p); //输出数组第一个元素的值 ``` 在这个例子,将数组的首地址赋给了指针变量p,然后通过解引用符号来访问数组的元素。 5. 指针的应用 指针C语言非常重要的概念,它可以用于很多方面。例如,可以通过指针来动态分配内存空间、访问硬件设备、实现复杂的数据结构等等。 总之,指针C语言非常重要的概念,程序员需要深入理解它的概念和用法,才能够在程序设计发挥其强大的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值