(1)一维数组和指针的关系:
int a[5] = {1, 2, 3, 4, 5};
int *p = NULL;
p = &a[0];
p = a;
数组的数组名a是指向数组第一个元素的一个指针常量
a == &a[0]
a 的类型可以理解为 int *
访问下标为n的数组元素的方式:
a[n] == *(a+n) == *(p+n) == p[n]
(2)一维数组传参:
int a[5] = {0};
int Fun(int *parray, int len);
(3)一维字符型数组传参:
char str[32] = {0};
int Fun(char *pstr, int len);
(4)字符串传参:
char str[32] = {"hello world"};
int Fun(char *pstr);
注意:
字符串遍历:
char str[32] = {"hello world"};
char *pstr = NULL;
pstr = str;
while (*pstr != '\0')
{
pstr++;
}
练习:封装一个函数MyStrcpy实现strcpy的功能
#include
#include
int MyStrcpy(char *pdst, char *psrc)
{
while (*psrc != '\0')
{
*pdst = *psrc;
pdst++;
psrc++;
}
*pdst = '\0';
return 0;
}
int main(void)
{
char src[32] = {0};
char dst[32] = {0};
gets(src);
MyStrcpy(dst, src);
printf("dst = %s\n", dst);
return 0;
}
练习:封装一个函数MyStrcat实现strcat的功能
#include
int MyStrcat(char *pstr1, char *pstr2)
{
while (*pstr1 != '\0')
{
pstr1++;
}
while (*pstr2 != '\0')
{
*pstr1 = *pstr2;
pstr1++;
pstr2++;
}
*pstr1 = '\0';
return 0;
}
int main(void)
{
char str1[32] = {0};
char str2[32] = {0};
gets(str1);
gets(str2);
MyStrcat(str1, str2);
printf("str1 = %s\n", str1);
return 0;
}
练习:封装一个函数MyStrcmp实现strcmp的功能
#include
int MyStrcmp(char *pstr1, char *pstr2)
{
while (*pstr1 == *pstr2 && *pstr1 != '\0')
{
pstr1++;
pstr2++;
}
return *pstr1 - *pstr2;
}
int main(void)
{
char str1[32] = {0};
char str2[32] = {0};
int ret = 0;
gets(str1);
gets(str2);
ret = MyStrcmp(str1, str2);
printf("ret = %d\n", ret);
return 0;
}
练习:封装一个函数,给定一个字符串,统计该字符串中大写字母、小写字母、数字和空格的个数
#include
int GetNum(char *pStr, int *pDaXie, int *pXiaoXie, int *pShuzi, int *pKongge)
{
int cnt_daxie = 0;
int cnt_xiaoxie = 0;
int cnt_shuzi = 0;
int cnt_kongge = 0;
while (*pStr != '\0')
{
if (*pStr >= 'A' && *pStr <= 'Z')
{
cnt_daxie++;
}
else if (*pStr >= 'a' && *pStr <= 'z')
{
cnt_xiaoxie++;
}
else if (*pStr >= '0' && *pStr <= '9')
{
cnt_shuzi++;
}
else if (' ' == *pStr)
{
cnt_kongge++;
}
pStr++;
}
*pDaXie = cnt_daxie;
*pXiaoXie = cnt_xiaoxie;
*pShuzi = cnt_shuzi;
*pKongge = cnt_kongge;
return 0;
}
int main(void)
{
char str[256] = {0};
int DaXieCnt = 0;
int XiaoXieCnt = 0;
int ShuziCnt = 0;
int KonggeCnt = 0;
gets(str);
GetNum(str, &DaXieCnt, &XiaoXieCnt, &ShuziCnt, &KonggeCnt);
printf("大写:%d\n", DaXieCnt);
printf("小写:%d\n", XiaoXieCnt);
printf("数字:%d\n", ShuziCnt);
printf("空格:%d\n", KonggeCnt);
return 0;
}
数组指针是指针,指针指向一个数组
指针数组时数组,数组每个元素都是指针类型
int *a[5] = {NULL};
定义一个指针数组,数组占40个字节空间,每个元素为int *型,共5个元素
int (*a)[5] = NULL;
定义一个数组指针变量,占8个字节空间,指针指向了一个int类型5个元素的数组
(1)数组指针:
int a[5];
&a:获得数组的首地址,其类型为int (*)[5]
注意:
对一维数组数组名&,值不变,类型升级为数组指针类型
对数组指针*,值不变,类型降级成为指向数组第一个元素的指针
1.封装一个函数实现MyStrlen实现strlen的功能
2.封装一个函数实现MyStrcpy实现strcpy的功能
3.封装一个函数实现MyStrcat实现strcat的功能
4.封装一个函数实现MyStrcmp实现strcmp的功能