C语言——数组指针

1.匿名数组:字符串:其值是首元素地址,是const char*

2.const:const int *p:说明不能通过p这个指针修改所指向的空间;

(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 *scr)
{
	char *ret = dest; 
	while(*scr)
	{
		*dest = *scr;
		++dest;
		++scr;
	}
	*dest = '\0';
	return ret;
}

(4)strcat函数

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

(5)strcmp函数

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

(6)strncpy函数

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

(7)strncat函数

char *Strncat(char *dest,const char *scr,int n)
{
	char *ret = dest;
	while(*dest)
	{
		++dest;
	}
	while(*scr && n != 0)
	{
		*dest++ = *scr++;
		--n;
	}
	*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;
}

(9)在一个字符串中查找某个字符串首次出现的位置

int findInLong(const char *s,const char *sub)
{
	int n = Strlen(s), m = Strlen(sub),i;
	for(i =0 ;i < n - m ;++i)
	{
		if(Strncmp(s+i,sub,m) == 0)
		{
			break;
		}
	}
	if(i<n)
	{
		return i;
	}
	else
	{
		return 0;
	}
}

3.void *:万能指针,可以接受任何类型的地址,但是万能指针不能作为指针进行指针运算,常要与强转搭配使用,一般是写代码自己也不知道是什么类型,降低程序耦合性

short i =10;
void *p;
p = &i;
printf("%d\n",(short *)p);

(1)实现memcpy

4.指向数组的指针

(1)格式:基类型 (*指针名)【元素个数】;*是类型说明符;如果没有括号,则是指针数组;

(2)区分指针数组和数组指针

数组指针:int (*p) [10]:是指向长度为10的整型数组的指针,保存了一个地址,为该整型数组的首元素地址;

指针数组:int *p[10]:定义了10个指针数组变量;

5.二维数组指针

(1)二维数组名就是指向长度为cols长度的一维数组首数组指针,一维数组名相当于指向该一维数组的首元素的数组指针;

(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 sumOfEdge2D(int (*a)[4],int rows)
{
	int cols = sizeof(*a) / sizeof(**a);
	int i,j,sum = 0;
	for(i = 0 ; i < rows; ++i)
	{
		for(j = 0 ; j < cols ;++j)
		{
			if(0 == i || 0 == j || i == rows || j ==cols)
			{
				sum += *(*(a + i) + j);
			}
		}
	}
	return sum;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值