数组与指针(复习)

课前一题:

#include <stdio.h>

 

int swap(int *p,int *q)   //用指针指向a,b的地址

{

   int m;

    m= *q;

   *q = *p;

   *p = m;

   return 0;

}

 

int main()

{

   int a = 5;

   int b = 6;

   swap(&a,&b);   //取a,b的地址

   printf("result = %d %d",a,b);

 

数组和指针的区别

空间分配:静态分配      动态分配

访问效率:直接访问      间接访问

安全性:容易造成数组越界    容易造成内存泄漏

函数形参:指针

处理对象:对数据进行处理    对地址进行处理

         连续分配空间      不一定连续

 

 

函数:

复用性

维护性

迭代性

 

函数名(自注释性)——可读性

函数名是指针常量:保存函数存放的地址

 

函数调用:

1、

读(不修改)实参变量对应内存空间的值时,传实参变量名;

写(修改)实参变量对应内存空间的值时,传实参变量的地址。

 

通过函数名找到函数的入口地址;

2、给形参分配的内存空间;

3、传值:把实参变量对应空间的值传给形参

4、执行函数体里的语句

 

 

不能返回局部变量地址

 

echo $? 当前程序执行后的返回值

 

return VS  exit

return 是返回给系统的

exit 是返回给用户的

 

如何实现函数的。。。

入口参数检查,//if( src == NULL|| head == NULL || tail == NULL){return NULL;}

返回值异常处理

不要依赖别人的程序

功能要单一

 

函数指针(传参时用):

int (*p_func)(int,int)

P_func = add;初始化

//p_func = &add;

回调函数(函数指针指向的函数)

 

用函数指针实现加法运算:

#include <stdio.h>

int add(int m,int n)

{

   return m + n;

}

 

int cal(int (*func)(int,int),int m,int n)

{

   return func(m,n);

}

 

int main()

{

   int num1 = 5;

   int num2 = 6;

   

   int result = cal(add,num1,num2);

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

}

 

 

如何用C语言实现面向对象:

 

作业:函数的可变参数

 

主函数的参数:(命令行参数)

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

argc参数个数(也算命令本身)

#include <stdio.h>

 

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

{

   if(argc != 2)

   {  

       printf("Please input a param!\n");

       exit(1);

    }

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

   

   int i;

 

    for(i = 0; i < argc; i++) //也可以用函数指针数组来存放 int (*fuc_arry[3])(int, int);

    {

       printf("argv[%d] = %d\n",i,atoi(argv[i]));

    }

   return 0;

}

 

 

 

 

删除字符串中出现次数最少的字符(仅限a~z)

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define MAX_SIZE 1024

 

char my_remove(char *str)

{

   if(NULL == str)

    {

       return NULL;

    }

   

   int len = strlen(str);

   char *ptr = (char *)malloc(sizeof(char) * (len + 1));

   int i = 0;

   int a[26] = {0};

   

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

    {

       a[str[i] - 'a']++;

    }

   

   int min = 256;

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

    {

       if(a[i] != 0 && min > a[i])

       {

           min = a[i];

       }

    }

   

   int j = 0;

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

    {

        if(a[str[i] - 'a'] != min)

       {

           ptr[j] = str[i];

           j++;

       }

    }

 

   ptr[j] = '\0';

   int len1 = strlen(ptr);

   printf("%s\n",ptr);

   free(ptr);

}

 

int main()

{

   char str[MAX_SIZE] = {0};

   

   printf("Please input a string:\n");

   gets(str);

 

   my_remove(str);

   //printf("result = %s",str);

   

   return 0;

}

 

 

#include <stdio.h>

#include <stdlib.h>

 

char * func(int *num)

{

   char *src = "hello world";

 

   *num = 5;

 

   return src;

}

 

传入参数,传出参数:

int main()

{

   int num;

   char *ptr = func(&num);

   printf("ptr = %s\n",ptr);

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

   return 0;

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值