清屏函数 %*d 函数返回数组名 返回局部变量的引用

1.C没有清屏函数。

   system函数是调用操作系统命令,windows下就system("cls"),如果是linux就system("clear"), 

   不过这也只是清控制台,要真的清屏那只能调用一下屏幕驱动了(可能强制立即关闭电源也可以)。


2.%*d表示忽略你输入的这个值。

#include<cstdlib>
int main(int argc,char **argv)
{
int year;
int code;
int count;


scanf("%d%*d%d",&year,&code,&count);
printf("%d %d ",year,code);
system("pause");
}

结果:

输入  12  23 14

输出  12  14

当你输入23 的时候,由于对应的是%*d,所以会忽略23,你输入的下个数14就成为code的值了,而不是count的值。如果要输出count的值你会看到是一个随机值(由于初始化的没有赋值)。


3.

char * getstring1() {
    char * p1 = "ac";
    return p1;
}

char * func_1() {
    char buff[3] = "ac";
    return buff;
}
 
int main()
{

    char * p1 = getstring1();
    char * p2 = func_1();

    printf("%s\n",  p1);
    printf("%s\n",  p2);   
    return 0;
}


#include <stdio.h>
#include <cstdlib>

char *sm(char o[20]);

int main()
{
char *p3 = new char[20];
char l[5]={"ac"};
p3=sm(l);
printf("%s",m);
system("pause");
return 0;
}
char *sm(char o[5])
{
char *p;
p=o;
return p;
}

p1输出结果是ac,但p2输出结果不是ac,p3输出的结果是ac。

原因:func_1()这里使用的是一个数组,是在栈中开辟空间来存放ac和‘\0’的,函数一旦调用结束,
就会释放这个函数的栈区空间,你再返回他的地址,所对应的内容,就会出错。结果是一个未知,可能是正确,也可能是错误的。在sm这个函数中返回的是指针,不是数组。I的作用域是{}内,所以传参的时候I的空间没有被释放,仍然可用,所以传参是可以的。

所以要返回一个字符串不要用数组的首地址,要用指针。

返回数组和返回局部变量的区别是,返回局部变量,你可以拿到这个值,而返回数组,你要拿到数组中的值,但此时栈空间已经被释放,你只是拿到了之前数组的首地址,但是值却拿不到了。所以当你要拿到值的时候,返回局部变量是可以的,但返回数组你就拿不到值了。


4.返回一个局部变量的引用

#include <cstdlib>
#include<iostream>
using namespace std;
 
int& func()
{
    int m=9;
    return m;
}
int main()
{
    int fp=func();
     
    cout<<fp<<endl;
system("pause");
     
    return 0;
}


int* func()
{
    int m=9;
    return &m;
}
int main()
{
    int *fp=func();
     
    cout<<*fp<<endl;
     system("pause");
    return 0;
}


我测试之后两个结果都是9.,但是书中一直强调不用返回局部变量的引用。

内存将销毁,但什么时候销毁不一定。输出9是正好在销毁前你访问了这个内存,要是销毁后就会出错了。


你退房以后,可能半小时后才有人去整理房间,你扔在那里里的卫生纸也许还在那里(变量值没“抹掉”)。也可能你前脚出门,后脚就有人进去打扫了,那你留着里面的痕迹就立即被清掉了。
不过无论里面的痕迹有没有被抹点,你再进入那个房间就是非法行为(你的printf),因为那个房间已经不属于你了,这是小偷行为,被抓住要罚钱的……

去看看退栈的实现。系统的栈不是销毁的,楼主好好去看看汇编吧,不要在那臆测,书上的说法并不一定能准确地令你理解。你的9还在,只是凑巧没有新函数压栈将它覆盖罢了。不要研究这些东西,好好看看汇编,然后学会看vc的反汇编。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值