Linux下的C语言——第十节 函数

1.函数的定义

返回数据类型 函数名(【形式参数说明表】)

Int main(int argc ,char *argv[])//char *argv[]等同char** argv

一个进程的返回值是给父进程看的。

1.5声明

返回值类型 函数名(【形参说明表】)

因为按顺序执行,如果后写的函数被前面调用,则要先在外部声明。

2.函数的传参

赋值传参(int a)

地址传参(int *a)

传递时发过来的应该是地址;

3.调用

嵌套调用

递归调用

4.函数与数组

形参表: 返回值类型 函数名(int *p)或者(int p[])两者的含义都是指针。

传参实参:  函数名(数组名);

特殊: 实参的数组的sizeof大小,和形参p指针sizeof大小是不同的。

所以函数要用到数组大小的话,要先把数组的大小当参数传递过来。

4.1一维数组

Int a[]={1,2,3,4,5};

Int *p=a;

实参          

a

*a 

  a[0] 

  &a[3] 

 p[i] 

 p 

 *p  

p+1

形参类型

int*

int

int

Int *

int

Int*

int

Int*

4.2二维数组

#define M 3 

#define N 4

Int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

1.一维数组传递形式

调用:     Print_arr(*arr,sizeof(a)/sizeof(a[0][0])); //或者&arr[0][0]。而arr错误

定义:  void print_arr(int *p , int n )

2.行列的形式:指向行的指针

调用:print_arr(arr ,M ,N);

定义: print_arr(int (*p)[N], int m ,int n)//指针数组,指向数组的指针

输出:printf("",*(*(p+i)+j));

3.二维数组型:其实其和2的本质都一样,形参p[][]其实还是一个指针

调用:同2

定义:print_arr(int p[][N], int m,int n)

输出:printf("%4d",p[i][j]);

Int a[M][N]={};

Int *p = *a;//把其当成长一维数组

Int (*q)[N] = a;//使用数组指针,指向数组

实参

a[i][j]

*(a+i)+j

a[i]+j

形参类型

int

Int*

Int *

实参

p[i]

*p

p+3

形参类型

int

Int

Int *

//p[i]一级指针的一个元素。p+3列地址

实参

q[i][j]

*q

q

q+2

形参类型

int

Int*

Int(*)[N]

Int (*)[N]

//*q意味*(q+0),第零行的列地址

//q+2行地址,所以用行指针接收

4.3函数与字符串数组

字符串的拷贝

#include <stdio.h>

#include <stdlib.h>

char *mystrncpy(char *dest,const char *src,size_t n)

{

    int i;

    for(i=0;i<n && (dest[i] = src[i]);i++)//字符串的一种交换方式

        ;

    for(;i<n;i++)

        dest[i] = '\0';//避免没有结束符

    return dest;

}

char *mystrcpy(char *dest,const char *src)

{

    char *ret =dest;//保证在有返回值的情况下返回正确的字符串

    if(dest != NULL && src != NULL)

        while ((*dest++ = *src++)!= '\0') //另一种字符串的交换方式

            {

                printf("%p\n",dest);

            }

    printf("dest,%p\n",dest);

    return ret;

}



int main()

{  

    char str1[]="helloworld"; 

    char str2[128];

    char *str=NULL; 

    str = mystrcpy(str2,str1);

    puts(str2);

    puts(str);

    exit(0);

}

5函数与指针

指针函数:类型是指针的函数

返回值 * 函数名 (形参)

Int * fun(int);

函数指针:指向函数的指针

类型(*指针名)(形参);

Int (*p)(形参)=函数名;

函数指针数组:指向函数的指针的数组

类型 (*数组名【下标】)(形参);

Int (*funcp[2])(int,int);

Funcp[0] = 函数名;

指向指针函数的函数指针数组

Int *(*funcp[N])(int)

main函数的形参查看


int main(int argc,char *argv[])

{

    int i ;



    printf("argc=%d\n",argc);

  //  for(i=0;i<argc;i++)

    for(i=0;argv[i]!= NULL;i++)

    {

        puts(argv[i]);

    }



    return 0;

}

[tom@CentOS7 function]$ ./fun abd fgf 12 34 ek

argc=6

./fun

abd

fgf

12

34

ek

函数与一维数组数组:特殊

static void printf_arr(int p[],int n)//(int *p,int n)

{

    int i;

    printf("%s,%d\n",__FUNCTION__,sizeof(p));



    for(i=0;i<n;i++)

    {

        printf("%d\n",*p+i);

    }

}

int main()

{

    int arr[]={1,2,3,4,5,6};

   

    printf("%s,%d\n",__FUNCTION__,sizeof(arr));



    printf_arr(arr,sizeof(arr)/sizeof(arr[0]));



    exit(0);

}

main,24

printf_arr,8

1

2

3

4

5

6

二维数组

1.计算平均值。此时不区分行列,用一维数组形式就行。

2.输出第2行的值。此时区分行列,用指针数组。

#define M 3

#define N 4

static int average_a(int *p,int n)//形参指针指向一维数组

{

    int i;

    float sum=0;



    for(i=0;i<n;i++)

        sum += p[i];

    return sum/n;

}

static void find_num(int(*p)[N],int num)//指针指向二维数组的行

{

    int i;



    for(i=0;i<N;i++)

    {

        printf("%d",*(*(p+num)+i));

    }

    printf("\n");

}



int main()

{

    int i;

    int a[M][N]={1,2,3,4,5,6,7,8,9,10,11,12};

    float ave;

    int n =1;

    ave = average_a(*a,M*N);

    printf("%f\n",ave);

    find_num( a,n );



    exit(0);

}

[tom@CentOS7 function]$ make funarrb

cc     funarrb.c   -o funarrb

[tom@CentOS7 function]$ ./funarrb

6.000000

5678

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sscanf函数C语言中一个非常常用的函数,它可以将一个字符串按照指定的格式转换成相应的数据类型。在嵌式开发中,sscanf函数也是非常常见的,因为很多时候需要从串口或者其他外部设备中读取数据,并将其转换成相应的数据类型进行处理。下面是一些sscanf函数的使用技巧: 1. 使用sscanf函数时一定要注意格式字符串的正确性。格式字符串中的占位符必须与待转换的数据类型相对应,否则会发生未知错误。 2. 如果待转换的字符串中包含多个数据,可以使用多个占位符进行转换。例如,如果待转换的字符串为"1,2,3",可以使用" %d,%d,%d"的格式字符串进行转换。 3. 可以使用sscanf函数的返回值来判断转换是否成功。如果返回值等于待转换字符串的长度,则说明转换成功,否则转换失败。 4. 如果待转换的字符串中包含浮点数,可以使用"%f"或者"%lf"的格式字符串进行转换。 5. 如果待转换的字符串中包含十六进制数,可以使用"%x"的格式字符串进行转换。 6. 如果待转换的字符串中包含字符或字符串,可以使用"%c"或者"%s"的格式字符串进行转换。 7. 如果待转换的字符串中包含指针类型的数据,可以使用"%p"的格式字符串进行转换。 总之,在使用sscanf函数时一定要注意格式字符串的正确性,否则很容易出现转换错误的情况。同时,还应该注意sscanf函数返回值的判断,以确保转换的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值