10 用指针来处理字符串
"hello whorld" ---为匿名数组,值为表示数组首元素地址
(1)可定义:char *p = "hello world",表示p的值是首元素地址。
(2)定义后不可被赋值:*p = 'A',编译无问题,运行系统崩溃。字符串常量在字符串常量区,不可修改。
11 const 关键字
(1)const int i:i不可被赋值。
(2)const int *p :则p不可使用间接访问改变指针指向的变量。
(3)根据功能使用,能加就加。
算法:
(1)计算字符串长度
int Strlen(char *s)
{
int counter = 0;
while(*s)
{
++counter;
++s;
}
return counter;
}
(2)字符串拷贝
void Strcpy(char *dest,const char *src)
{
while(*src)
{
*dest = *src;
++dest;
++src;
}
*dest = *src;
}
(3)字符串连接
char *Strcat(char *dest,const char *src)
{
char *ret = dest;
while(*dest)
{
++dest;
}
while(*src)
{
*dest++ = *src++;
}
*dest = '\0';
return ret;
}
(4)从第n个元素开始拷贝
char *Strncpy(char *dest,const char *src,int n)
{
char *ret = dest;
while(*src && n > 0)
{
*dest++ = *src++;
--n;
}
*dest = 0;
return ret;
}
(5)从第n个元素开始比较
int Strncmp(const char *s1,const char *s2,int n)
{
while(*s1 == *s2 && *s1 && *s2 && --n)
{
++s1;
++s2;
}
return *s1 - *s2;
}
12 void * -----万能指针
(1)可以接受任何类型的地址。
(2)不能进行指针运算。
(3)用时需要强制类型转换,在设计函数时无法确定数据类型时使用。
算法:内存拷贝
void *Memcpy(void *dest, const void *src, int n)
{
void *ret = dest;
char *p = (char *)dest;
char *q = (char *)src;
while(n--)
{
*p++ = *q++;
}
return ret;
}
注:参数类型可任意设置
13 数组指针
概念: 指向数组的指针。
int a[100]
①a:数组首元素地址。
②&a:整个数组的地址。
(1)定义:
int (*p)[10];
①p--表示指向长度为10的一维数组的指针。
②p基类型为int (*)[10]。
注:a[1][1] <=> *(*(a + 1) + 1)
算法:
(1)求极值
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(*(*(a +i) + j) > max)
{
max = *(*(a + i) + j);
}
}
}
return max;
}
练习:
1、编写程序在一个字符串中查找某个字串首次出现的位置, int subString(const char ts, const ch ar *sub);
#include<stdio.h>
#include<string.h>
int findSub(const char *s,const char *sub)
{
int a = strlen(s) - strlen(sub);
int i;
int b = strlen(sub);
for(i = 0;i <= a;++i)
{
if(strncmp(s + i,sub,b) == 0)
{
return i;
}
}
return -1;
}int main(void)
{
char s[100] = "hello china";
char sub[100] = "lo";
int a = findSub(s,sub);
if(a >= 0)
{
printf("found,%d\n",a);
}
else
{
puts("no found");
}
return 0;
}
2、用指向数组的指针作为函数的参数,编写程序计算某二维数组所有边上元素的和。
#include<stdio.h>
int addArray2D(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 (i == 0 || j == 0 || i == rows - 1 || j == cols - 1)
{
sum += *(*(a + i) + j);
}
}
}
return sum;
}int main(void)
{
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int rows = sizeof(a) / sizeof(a[0]);
int sum = addArray2D(a,rows);
printf("%d\n",sum);
return 0;
}