一、指向字符型数组的指针
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;
}