1.数组和指针的关系:
1.一维数组和指针的关系:
int a[5] = {1, 2, 3, 4, 5};
int *p = NULL;
p = &a[0];
p = a;
数组的数组名a是指向数组第一个元素的一个指针常量
a == &a[0]
a 的类型可以理解为 int *
有两种情况除外:
1.sizeof运算时
2.&运算符
访问下标为n的数组元素的方式:
a[n] == *(a+n) == *(p+n) == p[n]
2.一维数组传参:
int a[5] = {0};
int Fun(int parray[5]);
int Fun(int parray[], int len);
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++;
}
练习:封装一个函数MyStrlen实现strlen的功能;
1 #include <stdio.h> 2 3 int MyStrlen(char *pster)4 {5 int i = 0;6 int cnt = 0;7 8 while (pster[i] != '\0')9 {10 i++;11 cnt++;12 }13 return cnt;14 }15 16 int main(void)17 {18 char str[32] = "hello world";19 int len = 0;20 21 len = MyStrlen(str);22 23 printf("len = %d\n",len);24 25 return 0;26 }
练习:封装一个函数,给定一个字符串,统计该字符串中大写字母、小写字母、数字和空格的个数
提示: char str[256] = {0};
gets(str);
GetNum();
int GetNum(char *pstr, int *pDaxie, int *pXiaoxie, int *pKong, int *pShuzi);
while (*pstr >= 'a' && *pstr <= 'z')
{
xiaoxie++;
}
练习:封装一个函数MyStrcpy实现strcpy的功能
1 #include <stdio.h>2 3 int MyStrcpy(char *pdst,char *pstr)4 {5 while (*pstr != '\0')6 {7 *pdst = *pstr;8 pdst++;9 pstr++;10 }11 12 *pdst = '\0';13 14 return 0;15 }16 17 int main(void)18 {19 char str[32] = {0};20 char dst[32] = {0};21 22 gets(str);23 24 MyStrcpy(dst,str); 25 26 puts(dst);27 28 return 0;29 }
练习:封装一个函数MyStrcat实现strcat的功能
1 #include <stdio.h>2 3 int MyStrcat(char *pstr,char *pdst)4 {5 while (*pstr != '\0')6 {7 pstr++;8 }9 10 while (*pdst != '\0' )11 {12 *pstr = *pdst;13 pdst++;14 pstr++; 15 }16 17 *pdst = '\0';18 19 return 0;20 }21 22 int main(void)23 {24 char str[32] = {0};25 char dst[32] = {0};26 27 gets(str);28 gets(dst);29 30 MyStrcat(str,dst);31 32 puts(str);33 34 return 0;35 }
练习:封装一个函数MyStrcmp实现strcmp的功能
1 #include <stdio.h>2 3 int MyStrcmp(char *pstr,char *pdst)4 {5 while (*pstr == *pdst && *pstr != '\0' )6 {7 *pstr++;8 *pdst++;9 }10 11 return *pstr - *pdst; 12 }13 14 int main(void)15 {16 char str[32] = {0};17 char dst[32] = {0};18 int ret = 0;19 20 gets(str);21 gets(dst);22 23 ret = MyStrcmp(str,dst);24 25 printf("ret = %d\n",ret);26 27 return 0;28 }
2.数组指针和指针数组:
数组指针是指针,指针指向一个数组
指针数组时数组,数组每个元素都是指针类型
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的功能
5.封装一个函数实现字符串的倒置(逆序)
int InvertString(char *pstr);
6.从终端输入一个a和n封装函数按照如下公式获得结果
a:3
n:5
3+33+333+3333+33333 = 37035
1 #include <stdio.h>2 #include <string.h>3 4 5 int InvertString(char *pstr,char *pdst)6 {7 char tmp = 0;8 9 while (pstr < pdst)10 {11 tmp = *pstr;12 *pstr = *pdst;13 *pdst = tmp;14 pstr++;15 pdst--;16 }17 18 return 0;19 }20 21 int main(void)22 {23 char str[32] = {0};24 25 gets(str);26 27 InvertString(str,str + strlen(str) -1);28 29 puts(str);30 31 return 0;32 }
1 #include <stdio.h>2 3 int GetNum(int x,int y)4 {5 int i = 0;6 int sum = 0;7 int num = 0;8 9 for (i = 0;i < y;i++)10 {11 // num = num * 10 + x;12 // sum += num; 13 sum += x;14 x = (x * 10) + (x % 10);15 }16 17 return sum;18 19 }20 21 int main(void)22 { 23 int a = 0;24 int n = 0;25 int ret = 0;26 27 scanf("%d%d",&a,&n);28 29 ret = GetNum(a,n);30 31 printf("ret = %d\n",ret);32 33 return 0;34 }