| 网站首页 | 业界新闻 | 小组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
买学问 - 大牛一对一辅导,有问必答买学问 - 专业的付费知识问答平台
共有 566 人关注过本帖
标题:函数类型的形参.c和.cpp的一点区别
只看楼主 加入收藏
MeandC
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:8
帖 子:245
专家分:792
注 册:2018-7-14
结帖率:100%
  问题点数:0  回复次数:2   
函数类型的形参.c和.cpp的一点区别
先说一下.cpp的吧,这是c++文件的后缀,但是也是可以写C语言的,编c程序我也是用cpp后缀的,是因为我一开始写的时候书上传变量值得时候是用地址符的,然后我用.c为后缀,然后编译器报错,我也不知道错哪儿啊,先看一下用栈转化成二进制数的一个程序。
程序代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct {
    int *base;
    int *top;
    int stacksize;
}stack;
int initstack(stack &s) {
    s.base = (int*)malloc(sizeof(int) * 20);
    if (!s.base)exit(-2);
    s.top = s.base;
    s.stacksize = 20;
    return 1;
}
int push(stack &s, int e) {
    if (s.top == s.base + s.stacksize) {
        s.base = (int*)realloc(s.base, sizeof(int) * 10);
        if (!s.base)exit(-2);
        s.top = s.base + s.stacksize;
        s.stacksize += 10;
    }
    *s.top++ = e;
    return 1;
}
int pop(stack  &s, int &e) {
    if (s.base == s.top)return 0;
    e = *--s.top;
    return 1;
}
void conversion(int num) {
    int n;
    stack s;
    initstack(s);
    while (num) {
        push(s, num % 2);
        num /= 2;
    }
    while (s.top != s.base) {
        pop(s, n);
        printf("%d", n);
    }
    printf("\n");
}
int main()
{
    int m;
    printf("请输入要测试的组数:");
    scanf_s("%d", &m);
    int i, num;
    for (i = 0; i < m; i++) {
        scanf_s("%d", &num);
        conversion(num);
    }
    system("pause");
    return 0;
}

看一下形参里面就是地址符,这样调用函数中值的改变主函数中也会变的

然后看一下把.cpp改成.c后的结果是编译前就报错了,看一下
改成了.c后就得改了,一开始一头雾水的,不过还是写好了,看一下代码
程序代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct {
    int *base;
    int *top;
    int stacksize;
}stack;
int initstack(stack *s) {
    s->base = (int*)malloc(sizeof(int) * 20);
    if (!s->base)exit(-2);
    s->top = s->base;
    s->stacksize = 20;
    return 1;
}
int push(stack *s, int e) {
    if (s->top == s->base + s->stacksize) {
        s->base = (int*)realloc(s->base, sizeof(int) * 10);
        if (!s->base)exit(-2);
        s->top = s->base + s->stacksize;
        s->stacksize += 10;
    }
    *s->top++ = e;
    return 1;
}
int pop(stack  *s, int *e) {
    if (s->base == s->top)return 0;
    *e = *--s->top;
    return 1;
}
void conversion(int num) {
    int n;
    stack s;
    initstack(&s);
    while (num) {
        push(&s, num % 2);
        num /= 2;
    }
    while (s.base != s.top) {
        pop(&s, &n);
        printf("%d", n);
    }
    printf("\n");
}
int main()
{
    int m;
    printf("请输入要测试的组数:");
    scanf_s("%d", &m);
    int i, num;
    for (i = 0; i < m; i++) {
        scanf_s("%d", &num);
        conversion(num);
    }
    system("pause");
    return 0;
}



同一个c程序代码,c文件里形式参数不能带地址符,而c++文件能带地址符,而能带地址符是很方便的,调用函数是只需要写变量就好了,自定义函数也更好写。
你们在.c和.cpp这两的程序里面看到这样子有什么样的想法和观点,欢迎评论。代码是vs2017写的。
附件: 您没有浏览附件的权限,请 登录注册
2018-10-27 23:17
Mr_doge
Rank: 4
等 级:业余侠客
威 望:6
帖 子:139
专家分:293
注 册:2018-6-28
  得分:0 
ANSI C 标准规定相当保守,函数间传递结构、变量,只能传递该参量的地址或者数值而非其本身,不能加取地址符号,本身是语法细节区别。
不加取地址定义为指针,是传递地址,加取地址符,那是否能解释为,参量传递到函数,再取该参量地址,这样?

虽然总说C++是C的超集,但是实际上完全应当当作独立的语言看待,避免细节混淆,因为这些细节的确定,影响的是编译器内部的工作机制,完全可以想象编译器就是一个特殊的“函数”,虽然这个“函数”的大小和机制极其复杂,但想来其内部依旧是遵循了其诞生便传续下来的思想,那么如果C函数指定了接收int数值参量,我们自然不可能传递一个字符串地址,语法细节区别我想便是如此这般。

我想我虽然懂一点C,但我绝不认为我这样就算懂C++了,哪怕C++确实是在C的基础上发展来的,但是有太多细节特性与C有所区别了。

接下来就稍微说点个人看法吧,对C++不熟,不对,是不会,我就说下C的代码吧,我觉得既然涉及了malloc()和realloc()函数分配内存空间,还是得有回收比较好,虽说这个程序本身是演示,过完就关了没错。
毕竟C对内存的使用对于程序员是"绝对信任",但是这也就意味着它会傻乎乎的全部操作都由编写者决定一切,毕竟malloc分配的空间并不是变量声明,缺省值是auto
2018-11-20 16:18
MeandC
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:8
帖 子:245
专家分:792
注 册:2018-7-14
  得分:0 
回复 2楼 Mr_doge
简单的说一个是利用指针传值,一个是直接引用吧。

C果然是有点难啊!
2018-11-21 18:16







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025667 second(s), 8 queries.
Copyright©2004-2019, BCCN.NET, All Rights Reserved