Linux编程之C语言基础4
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 );
}
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 )
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);
}
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 整个数组的地址
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 ; 类型不一致, 强制类型转换,重点关注!
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所知道的房子里面去取数据
补充几张练习题图: