天天看點

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\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的指針的指針,二級指針