在學習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\n", 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\n", a, b);
26
27 a = 3;
28 b = 5;
29 swap2(&a, &b); //位址傳遞
30 printf("a2 = %d, b2 = %d\n", 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("\n");
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\n", 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\n", str);
11
12 p = "mike jiang";
13 printf("%s\n", p);
14
15 char *q = "test";
16 printf("%s\n", 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\n", 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\n", argc);
13 for (i = 0; i < argc; i++)
14 {
15 printf("%s\n", 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\n", 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的指針的指針,二級指針 |