zoukankan      html  css  js  c++  java
  • 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,转载请注明出处。

  • 相关阅读:
    HDU6300(2018多校第一场)
    HDU6301(2018多校第一场)
    HDU6308(2018多校第一场)
    HDU6299(2018多校第一场)
    HDU6298(2018多校第一场)
    HDU1255覆盖的面积
    51nod 2133 排队接水
    bryce1010专题训练——Splay树
    img
    操作系统实验代码
  • 原文地址:https://www.cnblogs.com/Alliswell-WP/p/C_BasicLearning_09.html
Copyright © 2011-2022 走看看