C语言04 指针

文章通过一系列C语言代码示例,介绍了指针的基本概念,如地址、指针运算符的区别,以及如何使用指针进行数值交换、数组排序。同时,探讨了二维数组的地址表示,函数指针的应用,包括调用函数和传递函数作为参数,以及指针数组的使用情况。
摘要由CSDN通过智能技术生成

1.指针就是地址。
2.printf(“a=%x\n”,*p); %x是以十六进制的形式输出数据
3.++p和p++的区别。
++p是先把p+1然后输出,p++是先把p输出然后p+1
4.封装一个函数实现两个数交换
注意:若形参不使用指针,只进行的是值的拷贝,虽然变量名相同,但是内存地址不同,不会影响main函数里的数据

#include<stdio.h>

void chageData(int *data,int *data2)
{
	int tmp;
	tmp=*data;
	*data=*data2;
	*data2=tmp;
}
int main()
{
	int data=10;
	int data2=20;

	printf("交换前:data=%d,data2=%d\n",data,data2);
	
	chageData(&data,&data2);
	printf("交换后:data=%d,data2=%d\n",data,data2);
	return 0;
}

5.输入三个数a,b,c; 要求不管怎么输入,在输出的时候,a,b,c就是由大到小的顺序输出,用函数封装实现.

#include<stdio.h>
void bijiao(int *a,int *b,int *c){
	int tmp;
	if(*a<*b){
		tmp=*a;
		*a=*b;
		*b=tmp;
	}
	if(*b<*c){
		tmp=*b;
		*b=*c;
		*c=tmp;
	}
	if(*a<*b){
		tmp=*a;
		*a=*b;
		*b=tmp;
	}
}
int main(){
	int a,b,c;
	puts("input three numbers:");
	scanf("%d%d%d",&a,&b,&c);
	printf("before:%d %d %d\n",a,b,c);
	bijiao(&a,&b,&c);
	printf("after:%d %d %d\n",a,b,c);
	return 0;
}

6.指针常量不能++,编译不过
任意类型的指针,sizeof=8
int arr[3]={1,2,3};
int *p=arr;
7.练习 : 将数组中的n个元素按逆序存放函数封装。

#include<stdio.h>

void initArry(int *arr,int size){
	int i;
	for(i=0;i<size;i++){
		printf("请输入第%d个数据:\n",i+1);
		scanf("%d",arr++);
	}
}
void printArry(int *arr,int size){
	int i;
	for(i=0;i<size;i++){
		printf("%d ",*arr++);
	}
	putchar('\n');
}
void revangeArry(int *arr,int size){
	int i,j;
	int tmp;
	for(i=0;i<size/2;i++){  
		j=size-1-i;
		tmp=*(arr+i);
		*(arr+i);=*(arr+j);
		*(arr+j);=tmp;
	}
}
int main(){
	int arry[5];
	int size=sizeof(arry)/sizeof(arry[0]);
	
	initArry(&arry[0],size);
	printArry(arry,size);
	revangeArry(arry,size);
	printArry(arry,size);
	return 0;
}

8.关于二维数组地址
int a[3][4]
行地址(父数组) a
列地址(子数组) a[0] a[1] a[2]

#include<stdio.h>
int main(){
	int arr[3][4]={{11,22,33,44},{12,13,15,16},{22,66,77,88}};

	printf("arr是父亲地址:%p,偏移后是%p\n",arr,arr+1);
	printf("arr[0]是子地址:%p,偏移后是%p\n",arr[0],arr[0]+1);
	printf("arr[0]是子地址:%p,偏移后是%p\n",*arr,*arr+1);
	return 0;
}

运行结果:
在这里插入图片描述

9.地址的三种表示方式
&arr[i][j] arr[i][j])
arr[i]+j *(arr[i]+j))
*(arr+i)+j ((arr+i)+j))
10.数组指针=二维数组名 偏移的是整个数组

例:#include<stdio.h>

int main(){
	
	int arr[3][4]={{11,22,33,44},{12,13,15,16},{22,66,77,88}};
	int i;
	int j;
	
	int *p;
	p=&arr[0][0];
	
	int (*p2)[4];
	p2=arr;
	
	for(i=0;i<3;i++){
		for(j=0;j<4;j++){
			printf("%d\n",*(*(p2+i)+j));
		}
	}
	return 0;
}

11.例:输入行列的值,输出对应的数据

#include<stdio.h>
void tipsInputHangLie(int *pm,int *pn){
		puts("输入行列值\n");
		scanf("%d%d",pm,pn);
		puts("done");
}

int getTheData(int (*p)[4],int hang,int lie){
	int data;
	data=*(*(p+hang)+lie);
	return data;
//return p[hang][lie];
}

int main(){
	
	int arr[3][4]={{11,22,33,44},{12,13,15,16},{22,66,77,88}};
	int ihang,ilie;
	int data;
	
	tipsInputHangLie(&ihang,&ilie);
	data=getTheData(arr,ihang,ilie);
	printf("%d行%d列的值:%d",ihang,ilie,data);
	return 0;
}

12.函数指针

#include<stdio.h>
int inCData(int data){
	return ++data;
}
void printWelcome(){
	
	puts("启动启动启动\n");
}

int main(){
	void (*p)();//定义一个指针函数变量
	int (*p2)(int data);
	p=printWelcome;//指向函数
	p2=inCData;
	(*p)();//调用
	printf("p2测试:%d\n",(*p2)(10));
	return 0;
}

13.函数指针
在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
int getMax(int data1,int data2){
	return data1>data2?data1:data2;
}

int getMin(int data1,int data2){
	return data1<data2?data1:data2;
}

int getSum(int data1,int data2){
	return data1+data2;
}

int dataHandler(int data1,int data2,int (*pfunc)(int,int)){
	
	int ret;
	ret=(*pfunc)(data1,data2);
	return ret;
}
int main(){
	
	int a=10;
	int b=20;
	int cmd;
	int ret;
	
	int (*pfunc)(int,int);
	
	puts("1 最大值,2 最小值,3 求和\n");
	scanf("%d",&cmd);
	switch(cmd){
		case 1:
			pfunc=getMax;
			break;
		case 2:
			pfunc=getMin;
			break;
		case 3:
			pfunc=getSum;
			break;
		default:
			printf("error");
			exit(-1);
			break;
	}
	ret=dataHandler(a,b,pfunc);
	printf("ret=%d\n",ret);
	return 0;
}

14.指针数组

#include<stdio.h>
#include<stdlib.h>
int getMax(int data1,int data2){
	return data1>data2?data1:data2;
}

int getMin(int data1,int data2){
	return data1<data2?data1:data2;
}

int getSum(int data1,int data2){
	return data1+data2;
}

int dataHandler(int data1,int data2,int (*pfunc)(int,int)){
	
	int ret;
	ret=(*pfunc)(data1,data2);
	return ret;
}
int main(){
	
	int a=10;
	int b=20;
	int ret;
	
	int (*pfunc[3])(int,int)={
		getMin,
		getMax,
		getSum};//函数指针数组
	for(int i=0;i<3;i++){
		ret=(*pfunc[i])(a,b);
		printf("ret=%d\n",ret);
	}
	return 0;
}

15.指针函数(函数的返回值是指针)

#include<stdio.h>
int* getPosPerson(int pos,int (*pstu)[4]){
	int *p;
	p=(int *)(pstu+pos);
	return p;
}
int main(){
	int scores[3][4]={
		{55,66,77,88},
		{66,55,99,100},
		{11,22,33,59},
		};
		int *ppos;
		int pos;
		printf("请输入号数:0 1 2\n");
		scanf("%d",&pos);
		
		ppos=getPosPerson(pos,scores);
		for(int i=0;i<4;i++){
			printf("%d ",*ppos++);
		}
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若木空灵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值