C基础学习笔记——01-C基础第09天(指针下)

在学习C基础总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。

01-C基础第09天(指针下)

目录:
1、指针和函数

(1)函数形参改变实参的值

(2)数组名做函数参数

(3)指针做为函数的返回值

2、指针和字符串

(1)字符指针

(2)字符指针做函数参数

(3)const修饰的指针变量

(4)指针数组做为main函数的形参

(5)练习:字符串反转

3、指针小结

1、指针和函数

(1)函数形参改变实参的值

 1 #include <stdio.h>
 2 
 3 void swap1(int x, int y)
 4 {
 5     int tmp;
 6     tmp = x;
 7     x = y;
 8     y = tmp;
 9     printf("x = %d, y = %d
", x, y);
10 }
11 
12 void swap2(int *x, int *y)
13 {
14     int tmp;
15     tmp = *x;
16     *x = *y;
17     *y = tmp;
18 }
19 
20 int main()
21 {
22     int a = 3;
23     int b = 5;
24     swap1(a, b); //值传递
25     printf("a = %d, b = %d
", a, b);
26 
27     a = 3;
28     b = 5;
29     swap2(&a, &b); //地址传递
30     printf("a2 = %d, b2 = %d
", a, b);
31 
32     return 0;
33 }

(2)数组名做函数参数

数组名做函数参数,函数的形参会退化为指针

 1 #include <stdio.h>
 2 
 3 //void printArrary(int a[10], int n)
 4 //void printArrary(int a[], int n)
 5 void printArrary(int *a, int n)
 6 {
 7     int i = 0;
 8     for (i = 0; i < n; i++)
 9     {
10         printf("%d, ", a[i]);
11     }
12     printf("
");
13 }
14 
15 int main()
16 {
17     int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
18     int n = sizeof(a) / sizeof(a[0]);
19 
20     //数组名做函数参数
21     printArrary(a, n); 
22     return 0;
23 }

(3)指针做为函数的返回值

 1 #include <stdio.h>
 2 
 3 int a = 10;
 4 
 5 int *getA()
 6 {
 7     return &a;
 8 }
 9 
10 
11 int main()
12 {
13     *( getA() ) = 111;
14     printf("a = %d
", a);
15 
16     return 0;
17 }

2、指针和字符串

(1)字符指针

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     char str[] = "hello world";
 6     char *p = str;
 7     *p = 'm';
 8     p++;
 9     *p = 'i';
10     printf("%s
", str);
11 
12     p = "mike jiang";
13     printf("%s
", p);
14 
15     char *q = "test";
16     printf("%s
", q);
17 
18     return 0;
19 }

(2)字符指针做函数参数

 1 #include <stdio.h>
 2 
 3 void mystrcat(char *dest, const char *src)
 4 {
 5     int len1 = 0;
 6     int len2 = 0;
 7     while (dest[len1])
 8     {
 9         len1++;
10     }
11     while (src[len2])
12     {
13         len2++;
14     }
15 
16     int i;
17     for (i = 0; i < len2; i++)
18     {
19         dest[len1 + i] = src[i];
20     }
21 }
22 
23 int main()
24 {
25     char dst[100] = "hello mike";
26     char src[] = "123456";
27     
28     mystrcat(dst, src);
29     printf("dst = %s
", dst);
30 
31     return 0;
32 }

(3)const修饰的指针变量

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 int main(void)
 6 {
 7     //const修饰一个变量为只读
 8     const int a = 10;
 9     //a = 100; //err
10 
11     //指针变量, 指针指向的内存, 2个不同概念
12     char buf[] = "aklgjdlsgjlkds";
13 
14     //从左往右看,跳过类型,看修饰哪个字符
15     //如果是*, 说明指针指向的内存不能改变
16     //如果是指针变量,说明指针的指向不能改变,指针的值不能修改
17     const char *p = buf;
18     // 等价于上面 char const *p1 = buf;
19     //p[1] = '2'; //err
20     p = "agdlsjaglkdsajgl"; //ok
21 
22     char * const p2 = buf;
23     p2[1] = '3';
24     //p2 = "salkjgldsjaglk"; //err
25 
26     //p3为只读,指向不能变,指向的内存也不能变
27     const char * const p3 = buf;
28 
29     return 0;
30 }

(4)指针数组做为main函数的形参

int main(int argc, char *argv[]);

1)main函数是操作系统调用的,第一个参数标明argv数组的成员数量,argv数组的每个成员都是char *类型
2)argv是命令行参数的字符串数组
3)argc代表命令行参数的数量,程序名字本身算一个参数

 1 #include <stdio.h>
 2 
 3 //argc: 传参数的个数(包含可执行程序)
 4 //argv:指针数组,指向输入的参数
 5 int main(int argc, char *argv[])
 6 {
 7 
 8     //指针数组,它是数组,每个元素都是指针
 9     char *a[] = { "aaaaaaa", "bbbbbbbbbb", "ccccccc" };
10     int i = 0;
11 
12     printf("argc = %d
", argc);
13     for (i = 0; i < argc; i++)
14     {
15         printf("%s
", argv[i]);
16     }
17     return 0;
18 }

(5)项目开发常用字符串应用模型

 练习:字符串反转

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 int inverse(char *p)
 6 {
 7     if (p == NULL)
 8     {
 9         return -1;
10     }
11     char *str = p;
12     int begin = 0;
13     int end = strlen(str) - 1;
14     char tmp;
15 
16     while (begin < end)
17     {
18         //交换元素
19         tmp = str[begin];
20         str[begin] = str[end];
21         str[end] = tmp;
22 
23         begin++;  //往右移动位置
24         end--;        //往左移动位置
25     }
26 
27     return 0;
28 }
29 
30 int main(void)
31 {
32     //char *str = "abcdefg"; //文件常量区,内容不允许修改
33     char str[] = "abcdef";
34 
35     int ret = inverse(str);
36     if (ret != 0)
37     {
38         return ret;
39     }
40 
41     printf("str ========== %s
", str);
42     return 0;
43 }

3、指针小结

定义

说明

int  i

定义整形变量

int *p

定义一个指向int的指针变量

int a[10]

定义一个有10个元素的数组,每个元素类型为int

int *p[10]

定义一个有10个元素的数组,每个元素类型为int*

int func()

定义一个函数,返回值为int型

int *func()

定义一个函数,返回值为int *型

int **p

定义一个指向int的指针的指针,二级指针

在学习C基础总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。

原文地址:https://www.cnblogs.com/Alliswell-WP/p/C_BasicLearning_09.html