Linux编程之C语言基础4

2025-10-22 17:42:50

1、函数传参

     int  min_func( int  a ,  int  b) //  函数的形参a、b

在调用的时候,等价于a和b被赋值了

 {

 return (a>b ? b : a );

}

      int  main ( void )

{

int x = 100;             ----- 实参

int y = 200;             ----- 实参

int min ;

min = min_func ( x ,  y); 

-----在函数调用的时候用实际值的参数给函数的形参赋值

            printf(“min = %d \n”,  min );

}

Linux编程之C语言基础4

2、在用数组做为形参的时候需要注意:

     数组名作为形参可以有以下形式

void func( char arr[ 256 ] )  

         void func( char arr[  ] )    函数的形参都只表示某数组的首元素地址

int  main(void)

{

         char ch[256];

func( ch ); // 数组名通常表示首元素的地址, 只有sizeof(ch)和&ch例外

}

void upper_case(char str[ ] )

upper_case.c:6:39: warning: ‘sizeof’ on array function parameter ‘str’ will return size of ‘char *’ [-Wsizeof-array-argument]

  printf("sizeof(str) = %ld \n", sizeof(str));

sizeof计算的是在函数形参中的额数组名, 实际计算的是sizeof(char *)

也就是char类型数据的地址(64位机中地址是用64位(8B)来表示的)\

upper _case中的形参str, 虽然定义的时候写成数组的形式, 但是sizeof只会把它当做是同类型的地址。sizeof(str )得到的是在不同系统中的地址字节数, 32位机所有的地址值都用 32位(4B)表示, 64位机用64位(8B来表示一个地址值)因为数组传参一般使用数组名来传递参数,数组名仅表示首元素的地址, 所以不能直接用形参名来计算数组的长度

通常要在函数中直到数组元素个数的时候,只能通过另一个形参来传递

upper_case(char str[ ]  , int   length )

Linux编程之C语言基础4

3、对应字符数组的操作, 可以有另一个处理方法:

    void upper_case(char str[ ] ) //  虽然定义成数组形式,但是本质还是个指针

{

         int i ;

         printf("sizeof(str) = %ld \n", sizeof(str)); // 最关键的是和sizeof结合的时候

 得到的是指针大小(64位机 8Bytes)

         printf("sizeof(str[0]) = %ld \n", sizeof(str[0])); //  对象依旧是char , 大小为1

         // for(i=0; i<sizeof(str)/sizeof(str[0]); i++)   NG   sizeof(str)/sizeof(str[0]恒为8

         for(i=0; str[i] != ‘\0’; i++)// 根据字符串尾来处理

         {

                  if(str[i] >='a' && str[i] <= 'z')

                          str[i] -= ('a'- 'A');// 97 - 65

         }

         printf("str :  %s \n", str);

}

Linux编程之C语言基础4

4、数组

  数组定义 

int arr[ 5 ] ; // 随机数 

int arr[ 5 ] = {11, 22, 33, 44 , 55};

int arr[ 5 ] = {11 }; // 11  0 0 0 0

int arr[  ] = {11,22,33} ; // 实际上元素总个数为3

 数组使用

使用下标 arr[0]  arr[1]  

 除了定义外 ,只能逐个赋值,和for循环是绝配 arr[i]

直接使用数组名

arr 通常情况下表示首元素地址 arr == &arr[0]

两个例外:  sizeof(arr)  只要arr不是形参数组名,就表示整个数组实际占用的字节数

          &arr    整个数组的地址

Linux编程之C语言基础4

5、函数:

定义----   返回值类型 函数名 ( 形参类型 形参名列表)

int       func    ( short a  , int x )

{

实现内容

}

调用----  

 被调用函数中需要使用怎么样的参数,该被调用函数会返回怎样的信息给我们

  1:  参数可以是调用函数中的变量、全局变量、常量, 使用这些值给被调用函数中的形参直接赋值

main()

{

func( 100 , 200  ) ;// 形参a等价于100,  b等价于200

}

2:   这被调用函数的返回值,有没有什么作用

函数的返回值通常根据需要来处理

通常返回的是数值就要处理,

如果返回的是处理过程的的状态就可以根据需要处理~

声明 : 仅仅是告诉编译器要调用的函数的返回值类型和形参类型

int   func( short  , int );

6、指针

1: 定义(指针变量不但包括了地址值,还包括了对象的信息)

指针是指针变量, 指针变量是存放地址的变量

在32位机,地址寻址范围就是 0x00000000 ~ 0xFFFFFFFF

           指针变量也就是4B的

在64位机,地址寻址范围就是

0x00 00 00 00 00 00 00 00 ~ 0xFF FF FF FF FF FF FF FF

           指针变量也就是8B的

定义指针需要留意它的类型  定义时候的*表示定义的是指针变量

1) 指针类型   *   指针变量名 ;

char   *  q ;

int     *  p ;

2)  指针类型   *   指针变量名 = 初值 ;

char  * q = NULL ; 

// NULL是唯一一个可以直接给指针赋值的常量

int     *  p  = NULL;

int  a = 100 ;

int * qq = &a ;   把a的地址给了qq 

//  用其它同类型变量的地址给指针变量赋值

char  * pp  = &a ;   类型不一致, 强制类型转换,重点关注!

Linux编程之C语言基础4

Linux编程之C语言基础4

7、2指针变量的使用

1) 直接使用指针变量 ,p始终代表地址

一般是对指针变量进行赋值或者判断 或者是运算

int  a = 100;

int *  p = NULL ;

p = &a ;// p 的值为a的地址

a = 200; // a 的值为200

if(p == NULL)

  ******8

2) 使用指针变量的解引用 , *p代表的是地址中的数据,如a 值

int  a = 100;

int *  p = NULL ;

p = &a ;// p 的值为a的地址

*p  就可以知道a的地址中有什么数据

应用场景:

         if(*p  == 0 ) // 读值做判断

*p  = 200 ; // 对a重新赋值为200

int  b   =  *p // 读值

*p 参与运算

 

*p 就是去到p所知道的房子里面去取数据

补充几张练习题图:

Linux编程之C语言基础4

Linux编程之C语言基础4

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
相关推荐
  • 阅读量:27
  • 阅读量:79
  • 阅读量:128
  • 阅读量:52
  • 阅读量:103
  • 猜你喜欢