Day 09

莱莱  论坛元老 | 2025-3-31 08:26:22 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1915|帖子 1915|积分 5745

文章目次

  



    • 指针数组
    • 指针和函数
    • 技能名词表明
    • 技能细节
    • 课堂笔记

  
指针数组

  1. #include<stdio.h>
  2. int main()
  3. {
  4.          int a[3] = {0,1,2};
  5.          //指针数组,它是数组,每个元素都是指针
  6.          int *p[3];
  7.          p[0] = &a[0];
  8.          p[0] = a;
  9.          p[1] = &a[1];
  10.          p[1] = a+1;
  11.          p[2] = &a[2];
  12.          p[2] = a+2;
  13.          //sizeof(p):3个元素,int*(32位)
  14.          //3 * 4 = 12
  15.          //sizoef(p[0]):第0给元素,int * = 4
  16.          int n = sizeof(p)/sizeof(p[0]);
  17.          int i =0;
  18.          for(i = 0;i < n;i++)
  19.         {
  20.                 p[i] = &a[i]; //a+i
  21.         }
  22.          for(i = 0;i < n;i++)
  23.         {
  24.                 //printf("%d\n",*p[i])
  25.                 printf("%d\n", *(*(p+i)));
  26.                 //p[i]等价于*(p+i)
  27.         }
  28.         return 0;
  29. }
复制代码
指针和函数

通过函数交换两个变量

  1. #include<stdio.h>
  2. void swap(int m, int n)
  3. {
  4.         int tmp;
  5.         tmp = m;
  6.         m = n;
  7.         n = tmp;
  8.         printf("m = %d,n = %d\n",m,n);
  9. }
  10. int main()
  11. {      
  12.         int a = 11;
  13.         int b = 22;
  14.         swap(a,b);//值传递
  15.         printf("a = %d,b = %d\n",a,b);
  16.         return 0;
  17. }     
复制代码
地址通报

  1. #include<stdio.h>
  2. void swap(int *m, int *n)
  3. {
  4.         int tmp;
  5.         tmp = *m;
  6.         *m = *n;
  7.         *n = tmp;
  8. }
  9. int main()
  10. {
  11.         int a = 11;
  12.         int b = 22;
  13.         //值传递,不管这个变量什么类型,只要是变量本身传递,就是值传递
  14.         //swap(a,b);//值传递
  15.         swap(&a,&b);  //地址传递,变量的地址
  16.         printf("a = %d,b = %d\n",a,b);
  17.         return 0;
  18. }
复制代码
 形参中的数组01

  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int a[] = {1,-2,3,-4,5,-6,7,-8,9};
  5.         int i = 0;
  6.         int n = sizeof(a)/sizeof(*a);
  7.         printf("排序前\n");
  8.         for(i = 0;i < n;i++)
  9.         {
  10.                 printf("%d ", a[i]);
  11.         }
  12.         printf("\n");
  13.         //冒泡排序
  14.         int j = 0;
  15.         int tmp;
  16.         for(i = 0;i < n-1;i++)
  17.         {
  18.                 for(j = 0;j < n-i-1;j++)
  19.                 {      
  20.                         if(a[j] > a[j+1])  //升序
  21.                         {
  22.                                 tmp = a[j];
  23.                                 a[j] = a[j+1];
  24.                                 a[j+1] = tmp;
  25.                         }
  26.                 }
  27.         }
  28.         printf("排序后\n");
  29.         for(i = 0;i < n;i++)
  30.         {
  31.                 printf("%d ", a[i]);
  32.         }
  33.         printf("\n");
  34.    
复制代码
形参中的数组02

  1. #include<stdio.h>
  2. //1、形参中的数组,不是数组,它是普通指针变量
  3. //2、形参数组:int a[100000],int a[],int *a对编译器而已,没有任何区别
  4. //3、编译器都是当做int*处理
  5. //4、形参中的数组和非形参数组区别:形参中的数组是指针变量,非形参数组就是数组
  6. //void print array(int a[100000])
  7. //void print array(int a[])
  8. void print_array(int a[], int n)
  9. {
  10.         int i = 0;
  11.         //64位系统,sizeof(a),a是指针变量,结果为8
  12.         //sizeof(a[0])第0个元素,是int类型,结果为4
  13.         /*int n = sizeof(a)/sizeof(a[0]);
  14.         printf("sizeof(a) = %d\n". sizeof(a));
  15.         printf("sizeof(a[0] = %d\n),sizeof(a[0])");
  16.         */
  17.         for(i = 0;i < n;i++)
  18.         {
  19.                 printf("%d, ",a[i]); //等价于*(a + i)
  20.         }
  21.         printf("\n");
  22.         //a = NULL;   //形参中的数组,不是数组,它是普通指针变量        
  23. }
  24. int main()
  25. {
  26.         int a[] = {1,-2,3,-4,5,-6,7,-8,9};
  27.         //print_array(a);  //传递的是,数组的首元素地址,&a[0]
  28.         //a = NULL;
  29.         int n = sizeof(a)/sizeof(*a);
  30.         print_array(a,n); //应该把数组元素个数传递过去
  31.         return 0;
  32. }
复制代码
 返回局部变量的地址

  1. #include<stdio.h>
  2. int *fun()
  3. {
  4.         int a;  //Linux64位,不允许返回局部变量的地址
  5.         return &a;
  6. }
  7. int main()
  8. {
  9.         int *p = NULL;
  10.         p = fun(); //接受函数返回的地址   
  11.         //到上一步使用完fun(),fun()内的a,自动释放,下面操作野指针
  12.         *p = 100; //操作指针所指向的内存
  13.         return 0;
  14. }
复制代码
返回全局变量的地址

  1. #include <stdio.h>
  2. int a; // 明确注释全局变量的用途
  3. int *fun() {
  4.     return &a; // 函数名更明确
  5. }
  6. int main() {
  7.     int *p = fun();
  8.     *p = 100;
  9.     printf("*p = %d, a = %d\n", *p, a); // 合并输出
  10.      *(fun()) = 111;
  11.     printf("a = %d\n", a);
  12.     return 0;
  13. }
复制代码
指针和字符串

字符串打印阐明

  1. #include<stdio.h>
  2. int main()
  3. {
  4.         char str[] = "hello mike";
  5.         //1、%s,从首元素开始打印,直到结束符位置
  6.         //2、%s,操作的是指针所指向的内容
  7.         //printf("str = %s\n", str);
  8.         //2、str是首元素地址,如果想打印str本身的值,%p,&x,&d,%o
  9.         printf("str = %p\n",str);  //一个个打印出来,地址
  10.         //3、str代表第0个元素,它是char
  11.         //printf("str3 = %s\n", *str);
  12.         printf("str3 = %c\n", *str);
  13.         int i = 0;
  14.         while(str[i] != '\0')  //while(*(str+i) != '\0'))
  15.         {
  16.                 printf("%c",str[i]);
  17.                 i++;
  18.         }
  19.         printf("\n");
  20.         return 0;
  21. }
复制代码
字符指针

  1. #include<stdio.h>
  2. int main()
  3. {
  4.         char str[] = "hello";
  5.         str[0] = '1';
  6.         *(str + 1) = '2';
  7.         //printf("str = %s\n", str);  //12llo
  8.         printf("str = %s\n",&str[0] +1); //2llo
  9.         printf("str = %s\n",str+1); //2llo
  10.         //定义一个指针,指向首元素
  11.         char *p = NULL;
  12.         p  = &str[0];
  13.         p  = str; //数组名就是首元素地址
  14.         *p = 'a';
  15.         p++;  //p = p +1
  16.         *p = 'b';
  17.         printf("str = %s\n", str); //abllo
  18.         printf("str = %s\n", p);  // &str[0]+1 //bllo
  19.         printf("str = %s\n",p-1);
  20.         return 0;
  21. }
复制代码
字符串拷贝问题

  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5.         char buf[100];
  6.         char *p = buf;
  7.         //1、p指向buf的首元素
  8.         //2、strcpy()是给p所指向的内存拷贝内容,字符串拷贝了buf
  9.         strcpy(p,"hello mike abc");
  10.         printf("p = %s, buf = %s\n",p,buf);
  11.         return 0;
  12. }
  13. int main01()
  14. {
  15.         char *p;
  16.         //1、不是给p变量拷贝内容
  17.         //给p所指向的内存拷贝内容
  18.         //3、P是野指针,给野指针所指向的内存拷贝内容,结果导致段错误
  19.         strcpy(p, "hello mike abc");
  20.         return 0;
  21. }
复制代码
 字符串拷贝函数

  1. #include<stdio.h>
  2. //void my_strcpy(char dst[].char src[])
  3. void my_strcpy(char *dst, char *src)
  4. {
  5.         int i = 0;
  6.         while(*(src+i)!='\0')
  7.         {
  8.                 *(dst+i) = *(src+i);
  9.                 i++
  10.         }
  11.         //结束符
  12.         *(dst + i) = 0;
  13. int main()
  14. {      
  15.         char src[] = "hello mike";
  16.         char dst[100];
  17.         char *p = buf;
  18.         my_strcpy(p,src);  //自定义拷贝函数
  19.         printf("dst = %s\n",dst);
  20.         return 0;
  21. }
复制代码
const修饰的字符指针 

  1. #include<stdio.h>
  2. int main()
  3. {
  4.         char buf[] = "hello";
  5.         char *p1 = buf;
  6.         *p1 = 'a'; //改变指针所指向的内存
  7.         p1 = NULL;//改变指针变量本身
  8.                   
  9.         //const修饰*,指针所指向的内存不能修改
  10.         const char *p2 = buf;
  11.         //*p2 = 'a'; //err
  12.         p2 = NULL; //ok
  13.         return 0;
  14. }     
复制代码
 字符串常量

  1. #include<stdio.h>
  2. void fun()
  3. {
  4.         printf("fun s2 = %p\n","hello mike");
  5. }
  6. int  main()
  7. {
  8.         //1、每个字符串都是一个地址,这个地址是指字符串首元素地址
  9.         //2、字符串常量放在data区,文字常量区
  10.         
  11.         printf("s1 = %s\n","hello mike");
  12.         printf("s2 = %s\n","hello mike");
  13.         printf("s3 = %s\n","hello mike"+1);
  14.         //fun();
  15.         return 0;
  16. }
复制代码
 文字常量区不答应修改01



  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5.         //1、字符串常量就是字符串的首元素地址
  6.         printf("s1 = %p\n","hello mike");
  7.         char *p1 = "hello mike";
  8.         printf("p1 = %p\n",p1);
  9.         char *p2 = "hello mike";
  10.         printf("p2 = %p\n",p2);
  11.         //2、字符串常量,文字常量区的字符串,只读,不能修改
  12.         printf("*p1 = %c\n",*p1); //读,ok
  13.         //3、p1指向字符串常量,字符串常量为只读,不能修改
  14.         //*p1 = 'a'; //修改 //err
  15.         char *p3 = "hello";
  16.         //4、p3指向文字常量区,不能改
  17.         strcpy(p3,"abc"); //err
  18.         return 0;
  19. }
复制代码
  文字常量区不答应修改02

  1. #include<stdio.h>
  2. void fun(char *tmp)
  3. {
  4.         *tmp = 'a'; //err
  5. }                  
  6. int main()
  7. {
  8.         char *p = NULL; //p是变量
  9.         "hello mike" //字符串常量,首元素地址
  10.                      
  11.         p = "hello mike"; //p指向字符串
  12.         //*p = 'a'; //err,指向文字区常量,文字常量区内容只读
  13.         p = NULL; //ok
  14.         p = "hello"  //ok
  15.                      
  16.         char *p2 = "abc";
  17.         fun(p2); //p2的值,是“abc”首元素地址
  18.         return 0;
  19. }
复制代码

字符串常量初始化问题

  1. #include<stdio.h>
  2. int main()
  3. {      
  4.         //1、p指针保存了“hello”的地址
  5.         //2、指针所指向的内存不能修改
  6.         char *p = "hello";
  7.         
  8.         //1、把"hello"一个一个字符放在buf数组中
  9.         //2、数组的元素可以修改
  10.         char buf[] = "hello";
  11.         
  12.         return 0;
  13. }
复制代码
main形参利用阐明 

  1. #include<stdio.h>
  2. //argv[]:它是数组,数组每个元素都是char*,每个元素都是字符地址
  3. //argc:argv[]元素个数
  4. //main()函数参数,需要用户传递
  5. int main(int argc,char *argv[])
  6. {
  7.         int i =0;
  8.         for(i = 0;i < argc;i++)
  9.         {
  10.                 printf("test = %s\n",argv[i]);
  11.         }
  12.         return 0;
  13. }
复制代码

 字符指针数组

  1. #include<stdio.h>
  2. //void fun(int a[])
  3. //void fun(int a[100])
  4. void fun()
  5. {
  6. }
  7. //void print_array(char * p[100],int n)
  8. void print_array(char *p[], int n)
  9. //void print_arrauy(char **p, int n)
  10. {
  11.         int i = 0;
  12.         for(i = 0;i < n;i++)
  13.         {
  14.                 printf("%s\n",p[i]);
  15.         }
  16. }
  17. int main()
  18. {
  19.         char *p1 = "hello";
  20.         char *p2 = "abc";
  21.         char *p3 = "mike";
  22.         char *p[] = {"hello", "abc", "mike"};
  23.         int n = sizeof(p)/sizeof(*p);
  24.         int i = 0;
  25.         for(i = 0;i < n;i++)
  26.         {
  27.                 printf("%s\n", p[i]);
  28.         }
  29.         return 0;
  30. }
复制代码
查找匹配字符串出现的次数

  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5.         char *p = "11abcd11122abcd333abcd3322abcd3333322qqq";
  6.         int i = 0; //累加器
  7.         char *tmp = NULL;
  8.         while(1)
  9.         {
  10.                 //查找匹配字符串,如果找到,返回匹配字符串的地址,没有找到返回空
  11.                 tmp = strstr(p, "abcd");
  12.                 if(tmp == NULL)
  13.                 {
  14.                         break;  //跳出循环
  15.                 }
  16.                 else //找到
  17.                 {
  18.                         i++; //累加
  19.                         //重新设置新的起点
  20.                         p = tmp + strlen("abcd");
  21.                 }
  22.         }
  23.         printf("出现abcd的次数为; %d\n", i);
  24.         return 0;
  25. }
复制代码
两头堵类型

  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5.         char *p = "  123456789   ";
  6.         char *start = p; //首元素地址
  7.         char *end = p + strlen(p) - 1; //尾元素地址
  8.         //从左往右
  9.         while(*start == ' ' && *start != '\0')
  10.         {
  11.                 start++;
  12.         }
  13.         while(*end == ' ' && end != p)
  14.         {
  15.                 end--;
  16.         }
  17.         int n = end-start+1;  //5-1=4,但是实际上元素由5个所以+1
  18.         printf("n = %d\n", n);
  19.         char buf[100]="aaaaaaaaaaa";
  20.         strncpy(buf,start,n);
  21.         buf[n] = 0; //结束符
  22.         printf("buf = %s\n",buf);
  23.         return 0;
  24. }
复制代码
课堂笔记

  1. void fun(int b[10][10]); //ok
  2. void fun(int **p); //err,二维数组不是二级指针
  3.                   
  4. int *fun(); //返回值是指针类型,指针函数
  5.             
  6. 0          数字0,和'\0'等价
  7. '\0'
  8. '0'
  9. '0'字符'0',不是结束符,ascii为48
  10. char a[] = {'a', 'b'};
  11. printf("%s\n",a); //乱码,没有结束符
  12.                   
  13. char a[10] = {'a', 'b'}; //后面自动补0
  14. printf("%s\n",a); //正常
  15.                   
  16. char a[] = {'a', 'b', 0};
  17. char a[] = {'a', 'b','\0'};
  18. printf("%s\n",a);//正常
  19.                  
  20. char a[] = {'a','b','0'};
  21. printf("%s\n",a); //乱码,没有结束符
  22.                   
  23. char buf[] = "hello"; //以字符串初始化,自动隐藏结束符'\0'
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表