2 qq 33515515 qq_33515515 于 2016.02.11 10:53 提问

C语言中main调用一个接口函数问题。

有一个字符串符合以下特征(” "abcd11111abcd2222abcdqqqqq"”),要求写一个函数(接口),输出以下结果
1) 求字符串字串(“abcd”)出现的次数,并把结果传出;
我昨天晚上写了半天,图片是昨天晚上写的代码。
图片说明
应该打印3,可是每次都打印0.
于是接见了一下其他人的代码,使用了指针。
图片说明
还是原来的接口,现在就能打印3了。
调用c接口的话,是不是放在了栈区,然后调用完了,系统就直接丢弃变为0了?
假设设置一个指针,然后指针指向i的地址,再把 main函数里面的i修改了,这样就打印3了。
我说的对吗? 我希望有人能够从内存四区模型详细给我讲讲。
感激不尽。

4个回答

91program
91program   Ds   Rxr 2016.02.11 11:06
已采纳

你这是形参与实参的问题,与栈没什么关系。你想改实参的值,就必须使用指针或者引用。否则,在函数内部变化的参数的值不会影响传入参数的值。

91program
91program 回复Mage灬缇奇: 建议你了解一下形参与实参,如:http://www.xuebuyuan.com/2180627.html
2 年多之前 回复
qq_33515515
qq_33515515 你的意思是,在被调用函数内部的值并不会影响函数参数的值。(除非用指针或者引用) 能详细解释下吗?谢谢。
2 年多之前 回复
caozhy
caozhy   Ds   Rxr 2016.02.11 11:09

你说的是果,不是因。因为一般情况下,我们不希望形参去修改实参,所以才丢弃。如果你希望实参作用到形参,那么使用指针(C)或者引用(C++)。

caozhy
caozhy 回复Mage灬缇奇: 大多数情况下,我们不希望这样。
2 年多之前 回复
qq_33515515
qq_33515515 我传入实参它就应该按照代码给我改数值(原谅我知识浅薄),我的理解是它应该改数值,结果却没改。当然我这是错的,我想知道原因。
2 年多之前 回复
zuishikonghuan
zuishikonghuan   2016.02.11 17:25

不管是不是指针,都是放栈里的,其实指针也是一个变量,&i是取出i的地址然后把这个地址放到栈上的,然后你在c()里面将这个地址解引用了,那么相当于修改的是这个指针指向的内存,因为i是main的局部变量,所以i也在栈上,c()返回后只是把栈上的i的指针清除掉了,但是修改的是i,所以结果正确

u012906277
u012906277   2016.02.15 11:41

其实是形参和实参的问题,

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C语言的本质(15)——C语言的函数接口入门
C语言的本质(15)——C语言的函数接口入门
c 语言模块接口函数在main之前注册
在工程中有多个模块,每个模块功能的自己的初始化函数。如何在程序启动的时候不经过main调用初始化各个模块?
关于c语言不同文件之间直接函数接口引用的简介
在实际工作中不通函数接口之间的调用以及不同文件之间函数接口的调用都很平常,但是在使用的时候会比较麻烦一些,有很多细节需要注意到
【C语言】C语言中main函数问题
前言 C的设计原则是把函数作为程序的构成模块。main()函数称之为主函数,一个C程序总是从main()函数开始执行的。 一、main()函数的形式 在最新的 C99 标准中,只有以下两种定义方式是正确的: int main( void )  /* 无参数形式 */ {     ...     return 0; } int main( int argc, char
C语言中int main()和int main(void)区别
1.K&R书上main函数定义写成main(){...} 形式,不写返回值类型也不写参数列表,这是Old Style C的风格。Old Style C规定不写返回值类型就表示返回int型,不写参数列表 就表示参数类型和个数没有明确指出。这种宽松的规定会导致很多复杂的Bug产生,不幸的是现在的C标准为了兼容旧的代码仍然保留了这种语法。  2. 其实系统在调用main函数时是传参数的,所以m
C语言函数和主函数的调用
在C语言中主函数在调用子函数时,会产生相应的栈去存放调用子函数时的值,当调用完毕时,调用子函数所生成的栈则立即销毁。主函数在调用子函数时如果为值传递时,则传过去的参数并不影响主函数中参数的值,如果采用地址传递,则在子函数时会改变参数地址所指向的值。 Note:1、在子函数中生成一个数组想要通过返回参数(指针变量)传回主函数时,实际上传不过去。因为子函数生成的数组在子函数所建立的栈中,当调用结束时
C语言中int main与void main的区别
<br />正确而且标准的方式应该是int main()或者int main(int argc, char* argv[])<br /> <br />原因是:main函数的返回值是用来表示程序的退出状态的,return 0表示无错误,其他的返回值根据系统不同可能代表不同的类型,如果不返回可能会无法检测到错误。<br /> <br />另外一个原因是:如果返回值是返回到栈上的,则程序未返回值的情况下,程序的调用者会从栈上误pop一个值认为是程序的返回值,这样的话就会造成下面的操作错误,因为多pop了一个值。<
C语言接口与实现【第一章】
本章作者首先引入了一个literate程序的概念,主要是定义了一些规则用于将接口、实现、解释语句交织在一起,用于提高代码的可读性和自解释。 下面两节作者粗略描述了编程风格和效率两个问题,这两个问题感触颇深。编程风格在一个公司需要统一,当业务进行部门间切换时,大家使用同一种风格,会让代码的理解很容易,另外较好的编程规范,能够提高代码的可阅读性,比如unsigned int定义的变量使用ui开头,而
C语言main函数的写法
main函数是C程序的入口函数,即程序的执行是从main函数开始,对其他函数的调动也是直接或间接地在main函数中被调用。那么main函数又是被谁调用呢?答案是操作系统。C语言发展至今,对main函数有多种不同的写法,下面就来探究一下各种不同的写法。注:测试环境为Ubuntu 17.10,GCC版本为7.2.0。 NO.1 main(){}例: #include mai
【C】C语言main函数的三种形式
在C语言中,main()函数有三种形式。 1、无参数 #include int main(void) { printf("Hello World!\n"); return 0; } 2、有两个参数 习惯上第一个参数是整型argc,保存了外部调用命令的参数个数,第二个参数是指针数组或二级指针argv,以字符串形式保存了与argc对应的参数,如下例子: #include