指针高阶---指针与二维数组

目录

二维数组:

数组本身的特点:

指针到二维数组:

用什么类型的指针指向二维数组?

访问数组元素:

二维数组求对角线最大值与副对角线最小值

指针实现字符串倒置

指针实现字符串转变为整数:

指针实现二维数组字符串逆序

指针实现字符串比较找最大值:

指针实现二维数组字符串排序

指针+函数:

main


二维数组:

本质:是一维数组的一维数组。

数组本身的特点:

①连续性(连续存储)②有序性 ③单一性(存储10同一种类型的数据)

指针到二维数组:

①应该定义什么类型的指针?

int a[10][10];

二维数组名a的含义:

1.代表数组首元素的地址&a[0];

2.代表二维数组的类型:(去掉名字即为类型)int[][]

存放的数据类型int[],即存放一维数组;

用什么类型的指针指向二维数组?

int a;int *p = &a;(p的类型为int*类型,它指向的内存空间(存放的地址)所存储的数据类型为int型)

推导一维数组:int a[10];一维数组内存空间存储的数据类型为(a[0])为int型,所以需要一个

int *型指针指向一维数组:int* p = a(即*a[0]),

推导二维数组:int a[2][2] ,存放的数据类型为int[2]一维数组类型,

所以需要int[2] * 型的指针指向二维数组,即int[2]* p,但编译器不支持这种写法,

应写为int (*p)[2];这种指向数组的指针称为数组指针

int (*p)[2] = a(等价&a[0]),a为二维数组名,也为二维数组首元素的地址(&a[0]),

p所指向内存空间存放的数据类型为int[]一维数组,所以对p进行加减操作时,中间的差值为一个一维数组的大小,p指向a[0],那么p+1就指向了a[1];a[0]里面存放了2个int型的数据。

访问数组元素:

1.从数组的本质出发,逐层访问,int a[i][j];第一层(p+i)代表第i个元素的地址,*(p+i)得到int[j]这种类型的地址*(p+0)即&a[0][0]的地址,在这个地址的基础上进行加加即(*(p+0))+1,即得到&a[0][1]的地址,简写为*(p+0)+1;要想访问到地址里面的值要在进行一次解引用即*(*(p+i)+j)等价于a[i][j]得到二维数组里面的值。

二维数组求对角线最大值与副对角线最小值

#include <stdio.h>

int nnMax(int (*a)[3],int row)
{
	int (*p)[3] = a;
	int i = 0;
	int j = 0;
	int max = **p;

	for(i = 1; i < row; i++)
	{
		for (j = 0; j < 3; j++)
		{
			if(i == j && *(*(p+i)+j) > max)
			{
				max = *(*(p+i)+j);
			}
		}
	}
	return max;
}
int nnmin(int (*a)[3],int row)
{
	int (*p)[3] = a;
	int i = 0;
	int j = 0;
	int min = *(*p+2);

	for (i = 0; i < row;i++)
	{
		for(j = 0; j < 3; j++)
		{
			if(j+i == 2 && *(*(p+i)+j)< min)
			{				
				min = *(*(p+i)+j);
	     	}
		}
	}
	return min;
}

void printArray(int (*a)[3],int row)
{
	int (*p)[3] = a;
	int i = 0;
	int j = 0;

	for (i = 0; i < row; i++)
	{
		for (j  = 0; j < 3; j++)
		{
			printf("%d",*(*(p+i)+j));
		}
		putchar('\n');
	}
}
int main()
{
	int a[3][3] = {3,5,2,6,1,7,9,8,4};

	printArray(a,3);
	printf("min = %d\n",nnmin(a,3));
	printf("max = %d\n",nnMax(a,3));

	return 0;
}

指针实现字符串倒置

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

void reverse(char *begin,char *end)//实现数组倒置
{
	while(begin < end)
	{
		int temp = *begin;
		*begin = *end;
		*end = temp;
		begin++;
		end--;
	}
}

void wordReverse(char *s)
{
	reverse(s,s+strlen(s)-1);

	char *p = s;
	char *q = NULL; 

	while(*s != '\0')
	{
		q = p;
		while(*q != ' ' && *q != '\0')
			q++;
		reverse(p,q-1);
		if(*q == '\0')
			break;
		q++;
		p = q;
	}
}

void Puts(char *s)
{
	while(*s != '\0')
	{
		putchar(*s);//结果输出you are how
		s++;
	}
	putchar('\n');
}

int main()
{
	char s[30] = "how are you";
	char len = strlen(s);

	wordReverse(s);
	Puts(s);
	
	return 0;
}

指针实现字符串转变为整数:

#include <stdio.h>

int change(char *s)
{
	int n = 0;
	int m = 0;

	while(*s != '\0')
	{
		m = *s -'0';
		n = n * 10 +m;
		s++;
	}

	return n;
}

int main()
{
	char *s = "12345";
	
	printf("%d\n",change(s));

	return 0;
}

指针实现二维数组字符串逆序

void pointerArrayReverse(char **begin,char **end)
{
	while(begin < end)
	{
		char *temp = *begin;
	   	*begin = *end;
		*end = temp;
		*begin++;
		*end--;
	}
}

指针实现字符串比较找最大值:

char *charPointer1(char **p,int len)
{
	int i = 0;
	char *max= *p;
	for (i = 0; i < len ;i++)
	{
		if(strcmp(*(p+i),max)>0)
		{
			max = *(p+i);
		}
	}
	return max;
}

指针实现二维数组字符串排序

void pointerArraySort(char **begin,char **end)
{
	char **p = begin;
	char **q = NULL;
	for(p = begin; p < end; p++)
	{
		for (q = p+1; q <= end; q++)
		{
			if(strcmp(*p,*q)>0)
			{
				char *temp = *p;
				*p = *q;
				*q = temp;
			}
		}
	}
}

指针+函数:

通过指针的方式来调用函数:

函数名即函数的入口地址

int add (int a,int b):

1.函数名对应的数据类型:int(int ,int)

2.回调函数实现两个数加减乘除

3.代表一类函数

4.返回值为int 型//带有两个int型的形参变量

5.函数名即函数的入口地址

#include <stdio.h>

int add(int a,int b)
{
	return a+b;
}

int sub(int a,int b)
{
	return a-b;
}

int mul(int a,int b)
{
	return a*b;
}

int div(int a,int b)
{
	return a/b;
}

void processData(int a,int b,int (*pfunc)(int,int))
{
	printf("%d\n",pfunc(a,b));
}

int main()
{
	int a,b;

	scanf("%d %d",&a,&b);

	processData(a,b,div);

	return 0;
}

main

include <stdio.h>

int main(int argc,const char *argv[])//argc命令行参数的个数,
//argv:存放命令行参数的字符串的指针数组
{
	printf("argc = %d\n",argc);
	
	int i = 0;
	for(i = 0; i < argc;i++)
	{
		printf("argv[%d] = %s\n",i,argv[i]);
		
	}
	
	return 0;

}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值