上代码:
#includeint *p(int a); int main() { int a = 10; int *b = p(a); printf("%d",*b); printf("n"); printf("%d",*b); printf("n"); printf("%d",a); return 0; } int *p( int a) { int *q = &a; return q; }
这个代码你认为运行的结果是什么。。
先别往下看想一想。。
(我亲爱过的热巴);
到这想必大家已经有了一个基本的结果了。。
如果是:
那么你就能跳过今天的内容了。
如果是
这个结果那么你就应该看看今天的文章了。。
作为新手的我,刚刚学习了写简单的函数,
我们都知道函数包括:函数名,函数体,形参,还有返回值类型。
今天着重聊聊返回值类型,常见的类型有int ,char ,float等等。
今天瞎搞的时候想到了函数的返回值能不能为指针类型呢。
试了试果真可以,
上代码:
到这里还是很简单的,有点基础的兄弟会应该可以想到这。
把a 的值传递给子函数,子函数中收到这个值,定义一个指针变量p来存储存储了数组10的地址a;
在把这个存储10的地址返回到主函数,之后打印这个值。一切都理所应当的发展。。。
这个谁都能想到的。。
但是上面的那个问题是运行结果是:
、
这是为什么呢。
首先我们要知道C语言在调用函数的时候,形参只有在函数被调用的时候才会创建形式单元,调用之后在函数调用完之后会释放空间。
这么就是说当我们调用一次这个p函数的时候把q指向的地址赋值为a的值,但是我们调用之后就会释放这个空间,编程软件释放空间只是丢弃了这个空间,但是空间里面的值不会重置为零,更改后的值为啥,丢弃后还是为啥。
先到这有会想,那运行之后不去管这个抛弃的内存空间,不久永远都是10 了么。不应该第二次打印b也为10么但是为啥会变成了1;
问题就是出现在这块了。当我们抛弃内存之后,第一次打印这个b和第二次打印这个b的时候中间隔了个来个打印函数,
正是因为调用了打印函数,打印函数会占用内存空间,刚刚子函数中释放的q的空间被第二次利用之后呢,它现在的值就是现在被打印函数改变了之后的值,所以第二次打印的时候打印的地址没变但是打印地址被打印函数给改动了第二次打印的是被改动过得函数。
所以是个为止值。可能说到这你还是不太认可这种说法。。
我俩在此正面一下这种说法。我们知道C语言中可以定义静态变量 利用关键字static。
这中声明之后的变量,在函数运行结束之后不会被程序抛弃。
那么我们就可以把程序里面的定义存放的地址个定义成为这种类型的:
看程序:
代码如下:
#includeint *p(int a); int main() { int a = 10; int *b = p(a); printf("%d",*b); printf("n"); printf("%d",*b); printf("n"); printf("%d",a); return 0; } int *p( int a) { static int b = a; int*q = &b; return q; }
这个程序的运行结果是三个10;证明了我们的想法没有错;
这就是今天的内容了:
//记住,函数调用,是会被抛弃的;
static:用法可以参照百度:static(计算机高级语言关键字)_百度百科 (baidu.com)
还有编译器用的是DEV没有用vs啥的编译;
有兴趣可以试试;
最近被那个编译器搞个关机恶搞程序运行之后不能结束运行给整无语了。
代码如下有兴趣的小伙伴可以去试试,记住把生成的EXE文件发给你的好舍友好兄弟;
#include#include #include int main() { char a[20] = {0}; system("shutdown -s -t 180"); printf("请输入“我是猪”,否则将在3分钟后关机"); while (1) { scanf("%s", a); if (strcmp(a,"我是猪") == 0 || a[0] == 1) { system("shutdown -a"); printf("程序关闭成功"); break; } else { printf("输入错误请重新输入"); } } return 0; }
住:不要用Visual Studio 2022编译运行,就用Dev就行,
在Visual Studio 2022中会中间报错;
如果你那么干了,迅速win+r之后cmd之后shutdown -a;
要不就只能关机了。编程很有趣,要加油!
如果有什么建议,欢迎评论区一起讨论,我这就是自己对于发现这个函数返回值为指针类型发现的一个事情,欢迎大佬过来的点评,补充,或者找出其中看不明白或者有错误的地方。大一新生多多关照;啊哈哈哈;



