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
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
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
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
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
2 #include
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
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 }