C语言:给main传参、指针

一、给main函数传参:

   argc : 代表的是执行程序时,给main函数传递的参数的个数;
   argv[i]:代表的是执行程序时,给main函数传递的具体的参数

    例如:
     ./a.out  12    hj    k   y    m   4
       |    |     |     |   |     |   |
     argv[0] argv[1] argv[2] argv[3] argv[4] argv[5] argv[6]
     此时argc的值为7

点击查看代码
#include <stdio.h>

int main(int argc, char *argv[])
{
       int i = 0;
       printf("argc=%d\n",argc);
       for(i=0; i<argc; i++){
           printf("%s  ", argv[i]);
       }
       printf("\n");
 
       return 0;
}
//执行结果:
//ubuntu@linux:~$ ./a.out 89 ww qq pp bb rr y7 k2
//argc=9
//./a.out  89  ww  qq  pp  bb  rr  y7  k2

练习、给main函数传参,参数是一个五位数的字符串,转换成数字输出
   ./a.out  12345

   

   字符 1(ascii:49) 和 字符 0(ascii:48) 之间的ASCII码之间相差1,所以当字符1 减去 字符 0时,它们的ASCII码之差就是 数字1 ;
   同理其它字符型数字 也可以直接减去字符0 就可以得到对应的整形数字。

二、指针:指针就是内存中的地址

   地址可分为:物理地址,逻辑地址和线性地址。
   在C语言中,使用取地址符  &  取到的地址值,是逻辑地址。
   逻辑地址是相对于当前进程数据段的地址(偏移地址),不和绝对的物理地址直接相关联。
   逻辑地址不是被直接送到内存总线,而是送到内存管理单元(MMU)。MMU由一个或一组芯片组成,其功能就是把逻辑地址映射为物理地址,即进行地址转换。
   
引用来源:https://www.cnblogs.com/liuzhang/p/3729167.html

   1、指针的组成
     存储类型 数据类型 * 变量名 = value;

     例如:auto char * p = NULL;

   2、野指针:指针指向一个不合法的地址,那么在操作的时候有可能会报段错误;

     注:如果p指针还未指向任何地址的前提下:
        p = a;//错误,不能这样写。 p必须指向一个地址,p=a,将a赋值给p指向的变量,但是由于p没有指向地址,所以这句话是错误的。
      即:指针必须要遵守先初始化,再使用的原则;
       1、定义指针
       2、分配内存(使指针指向某个地址)
       3、使用

       注:在定义指针时,没有为该指针分配内存(赋初值),则这个指针就叫做野指针。野指针肯能导致不可预期的后果。

     实例:
        int a =10;
        int p = &a; //将p指针指向变量a
        //p = &a;
        printf("
p = %d\n",p); //p 代表取a中的内容(*p = a)

        *p = 100;
        printf("a = %d\n",a);
        printf("&a = %p,p = %p,&p = %d\n",&a,p,&p);  //&a 代表a的地址  p=&a (a的地址) &p 代表取p变量的地址(指针变量的地址)

   3、如何规避野指针?
      在定义指针的时候赋值NULL,在释放后赋值NULL;

   4、使用指针变量的应用:
     代码:
       void swap1(int a, int b) //不可以实现值的互换(主函数里面的a,b的值并未互换)
       {
         int temp;
         temp = a;
         a = b;
         b = temp;
       }

       为什么无法交换?
         直接传递参数给函数swap,传递的是变量的拷贝。而不是变量本身。
         也就是说在swap函数内部a和b是外部两个参数的拷贝。所以在swap外部看a和b还是原来的值。

       void _swap2(int *a,int *b) //可以实现数值互换
       {
         int temp;

         temp = a;
         
a = b;
         
b = temp;
       }

三、二级指针

   char q;
   int 
p;
   二级指针是指向一级指针的地址。(一般在函数调用的时候使用)

  (1)、二级指针只能存储一级指针的地址。
  (2)、二级指针可以更改一级指针的指向。

点击查看代码
int main()
{
    int  a = 10;
    int  *p;
    int  **q;
    p  =  &a;
    q  =  &p;
    printf("a = %d, *p = %d , **q = %d\n",a,*p,**q);
    printf("&a = %p, p = %p, &p = %p, q = %p, &q = %q, *q = %p\n",&a,p,&p,q,&q , *q);
    
}
//输出结果为:
//a = 10 , *p = 10, **q = 10
//&a = 0xbfbb8cc4 ,  p = 0xbfbb8cc4,  &p = 0xbfbb8cc8,  q = 0xbfbb8cc8,  &q = 0xbfbb8ccc, *q = 0xbfbb8cc4     
点击查看代码
//(通过二级指针 q 改变一级指针 p 的值(指向))
void change_data(int  **q)
{
    **q = 100;
    (*q)++;
}
int main( int argc , int argv[ ])
{
    
    int  a[2]  =  {10,9};
    int  *p =  a;
    
    printf("*p = %d\n",*p);
    change_data(&p);
    
    printf("a[0] = %d"a[0]);
    printf("*p = %d\n",*p);
    return  0;
}
//输出结果:
//*p = 10;
//a[0] = 100;
//*p = 9;
posted @ 2022-06-24 14:46  皆为过客  阅读(432)  评论(0)    收藏  举报