嵌入式学习的第十五天-指针

一、指向字符型数组的指针

1.【const】:关键字能加就加,提高函数传参的适应性

 2.【const】: 在指针前加const修饰表示无法通过指针修改指向的变量,对指针指向的变量只可

读,不能改。

3.void*万能指针,不能作为指针,进行指针运算,用来强制类型转换,适用于未知类型,类型多变

情况

注: 适用于任何类型的数组,此时*Strncpy =*Memycpy

4.练习

(1)Puts函数

void Puts(const char *s)
{
	while(*s)
	{
		putchar(*s++);
	}
	putchar('\n');
}

(2)strlen函数

int Strlen(const char *s)
{
	int counter = 0;
	while(*s)
	{
		++counter;
		++s;
	}
	return counter;
}

 (3)strcpy函数

char *Strcpy(char *dest,const char *src)
{
	char *ret = dest;
	while(*src)
	{
		*dest++  = *src++;
	}
	*dest = 0;
	return ret;
}

返回值为char* 原因:为了使用链式结构

 

(4)strcat函数

char *Strcat(char *dest,const char *src)
{
	char *ret = dest;
	while(*dest)
	{
		++dest;
	}
	while(*src)
	{
		*dest++ = *src++;
	}
	*dest = 0;
	return ret;

}

(5)strcmp函数

char *Strncat(char *dest,const char *src,int n)
{
	char *ret = dest;
	while(*dest)
	{
		++dest;
	}
	while(*src && n--)
	{
		*dest++ = *src++; 
	}
	*dest = 0;
	return ret;
}

(6)strncpy函数

char *Strncpy(char *dest,const char *src,int n)
{
	char *ret = dest;
	while(*src && n--)
	{
		*dest++ = *src++;
	}
	*dest = 0;
	return ret;
}

(7)strncat函数

char *Strncat(char *dest,const char *src,int n)
{
	char *ret = dest;
	while(*dest)
	{
		++dest;
	}
	while(*src && n--)
	{
		*dest++ = *src++; 
	}
	*dest = 0;
	return ret;
}

(8)strncmp函数

int Strncmp(const char *s1,const char *s2,int n)
{
	while(*s1 == *s2 && *s1 && *s2 && --n )
	{
		++s1;
		++s2;
	}
	return *s1 - *s2;
}

二、数组指针

1.数组指针的定义

   格式:基类型 (*指针名)【元素个数】;*是类型说明符;

int (*p)[10];/指向长度为10的一维整形数组的指针,sizeof(p) = 8;
int *p[10];//指针数组,sizeof(p) = 80;

2. 应用于二维数组

 二维数组名就是指向长度为cols长度的一维数组首数组指针,一维数组名相当于指向该一维数组的

 首元素的指针;

int a[3][4];
&a //int (*)[3][4] 二维数组
a <=> &a[0] //int (*)[4] 一整行
a[0] <=> &a[0][0] //int * 一个

注:运行结果为7

3.练习

(1)二维数组的遍历

void printArray2D(int (*a)[4],int rows)
{
	int cols = sizeof(*a) / sizeof(**a);
	int i,j;
	for(i = 0;i < rows;++i)
	{
		for(j = 0;j < cols;++j)
		{
			printf("%2d ",*(*(a + i) + j));
		}
		puts("");
	}
}

(2)二维数组找最大值

int maxOfArray2D(int (*a)[4],int rows)
{
	
	int cols = sizeof(*a) / sizeof(**a);
	int i,j;
	int max = **a;
		
	for(i = 0;i < rows;++i)
	{
		for(j = 0;j < cols;++j)
		{
			if(max < *(*(a + i) + j))
			{
				max = *(*(a + i) +j);
			}
		}
	}
	return max;

}

(3)二维数组边缘项求和

int sumOfArray2D(int (*a)[4],int rows)
{
	
	int cols = sizeof(*a) / sizeof(**a);
	int i,j;
	int sum = 0;
	for(i = 0;i < rows;++i)
	{
		for(j = 0;j < cols;++j)
		{
			if(0 == i || 0 == j || rows -1 == i || cols - 1 == j)
			{
				sum += *(*(a + i) + j);
			}
		}
	}
	return sum;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值