c++里面函数和指针的问题
#include<iostream>
using namespace std;
int *max(int a)
{
    a=6;
    return &a;
}
int main()
{
    int a(5),*p;
    p=max(a);
    cout<<*p;
    system("pause");
    return 0;
}

这是一个简单的程序,输出结果是6,但是如果改成下面这样

#include<iostream>
using namespace std;
int *max(int a)
{
    a=6;
    return &a;
}
int main()
{
    int a(5),*p;
    p=max(a);
    cout<<*p<<'\n';
    system("pause");
    return 0;
}

输出结果就变成10了,甚至改成下面

#include<iostream>
using namespace std;
int *max(int a)
{
    a=6;
    return &a;
}
int main()
{
    int a(5),*p;
    p=max(a);
    cout<<a;
    cout<<*p;
    system("pause");
    return 0;
}

p的结果又不正确了,请问这是为什么><

0

2个回答

首先注意:最好不要用max、min等做函数名,因为C++标准库中已经用了。不过这里max函数只有一个参数是不会影响的。

主要原因:max函数中的a和主函数中的a不是一个变量!

max函数中的a是以值的方式传进去的,也就是说,两个a只是值相同而已,存放的地址并不相同。而且max函数调用完了以后,参数a就被销毁了,这时再访问它的地址就是一个随机的值,甚至有可能是重要的变量。
解决办法:把max的参数a设为引用(定义时在前面加一个&号),这样两个a就是同一个变量了。但是,a=6会改变主函数中的a的值。

如果有帮助,希望采纳,谢谢

0
weixin_41461277
_ZGq 回复weixin_44027407: 那可能是偶然正确了。比如说在函数内定义变量初始值是随机的,但也有可能恰好是0。
6 个月之前 回复
weixin_44027407
weixin_44027407 不好意思,再问一下为什么第一个程序输出的结果是正确的?第一个程序中也是访问地址
6 个月之前 回复

这几个程序都会报段错误,应该是你的编译器的问题,你是不是用的 Visual studio ?

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C语言 在被调函数中改变指针变量值的方法
先看一段代码: #include   void foo(char *p) {    p = "after foo()"; }      void main() {    char *p = "before foo()";    foo(p);         cout } 如果你指望函数foo能帮你改变p的值,那你就错了。因为指针也是变量,它在函数调用过程中也是传
【编程语言】C语言指针(包括:指针与数组、指针与字符串、指针与函数)
指针概述 指针的概念 在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,例如int型占4个内存单元,char型占1个内存单元。为了正确地访问这些内存单元,必须为每个内存单元编上号,根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这...
C语言 函数指针和指针函数及Main()函数
正文 先来看看两者的定义以及说明。 指针函数 定义 指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。 声明格式为:类型标识符 *函数名(参数表) 这似乎并不难理解,再进一步描述一下。 看看下面这个函数声明: int fun(int x,int y); 这种函数应该都很熟悉,其实就是一个函数,然后返回值是一个 int 类型,...
C中双重指针的使用的易错点
写blog之前,看了很多CSDN的文章,都表示坚持写blog对一个程序员来说是很好的习惯,我以前也觉得写blog也只是浪费时间和精力,觉得自己弄懂了就好,然而事实上过一段时间后碰到相同的问题却还是需要时间去回忆和查找记录,这也就让我产生了开始写blog的想法。这是我的第一篇blog,的写的不好之处请大家见谅。 言归正传,在c的使用中能用到双重指针的地方不多,其中一个地方就是函数传指针却没有改变指针
c语言指针经典问题(交换两个数字)
1.互换两个数字: # include&amp;lt;stdio.h&amp;gt; void g(int * p,int * q) { int t; //如果要互换*p和*q的值,则t必须定义为int, t = * p; //不能定义为int*,否则会有语法错误. * p = * q; * q = t; } int main() { ...
C语言 如何在函数中使用指针?
一指针变量做函数参数 1列子引出 2源码实现 3错误分析 错误类型一 错误类型二 错误类型三 4主调函数传回数据的第二种方式 二数组做函数参数 三函数的指针 1函数语句的存储和函数的指针的定义 2变量指向函数及函数调用 3示例读者,你好! 如果你精通C,希望得到你的斧正;如果你是初学者,希望对你有所帮助! 加粗的是我认为比较重要的内容一、指针变量做函数参数1、列子引出先用一个列子来说明,何为指针
C语言函数返回类型为指针时的四个问题
1.先看程序: #include char  *returnStr() {            char  *p = “tigerjibo”;            return  p; } int  main() {            char*str;            str =returnStr();  
自定义strstr函数(指针)
#include #include&amp;amp;lt;string.h&amp;amp;gt; using namespace std; char * mystrstr(char *arr1,char *arr2) { char *g=NULL; int i=0; int j=0; int count=0; int len=strlen(arr2); while(arr1[i]!=’\0’) { g=&amp;amp;amp;arr1[i]...
指针作为函数的参数,则不能用此申请内存
今天读到林悦的一句话:如果函数是一个指针则不要指望使用该指针申请动态内存,找了几个例子方便理解: void GetMemory1( char *p ) {   p = (char *) malloc( 100 ); } void Test( void ) {   char *str = NULL
C语言函数传递指针参数的问题
一个问题是,我们想用一个函数来对函数外的变量v进行操作,比如,我想在函数里稍微改变一下这个变量v的值,我们应该怎么做呢?又或者一个常见的例子,我想利用swap()函数交换两个变量a,b的值,我们应该怎么做呢(好吧,博主是觉得这个问题十分经典)。 如果你真的理解C语言中【函数】这个工具的本质,我想你稍微仔细的思考一下,可能就不会来查看博主的这篇文章,对函数来说,它所传递的任何参数仅仅是原来参数的一...
C语言--局部变量作为指针返回值的问题
代码: #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; int* getStu(int x, int y) {         int i = x+y;         return &amp;amp;i; } int main() {         int x = 2, y = 3;         int *s = getStu(x, y);...
用指针解决约瑟夫问题
其实本文中的链表并不规范,只适用于本题,还有鄙人第一次发文,请多多指教 #include #include using namespace std; class J { public:  J(){};  string name;  J *pre;//前一个人  J *next;//后一个人 }; void Joseph(J *head,int n) {
C 指针的知识点(初始化,赋值,函数指针,指针++)
1)指针的初始化 指针初始化目的就是让指针知道指向那个地址。第一种方法就是在定义指针的同时告诉指针指向的地址,第二中情况,不在定义指针的时候初始化,而是把地址直接赋值给指针变量。注意:不可以在指针不清楚指向地址的情况下给指针赋值(但是char p=0或者p=NULL除外,该语句表示指针为空)。 第一种方法:在指针定义的时候告诉指针指向的地址。 下面这样初始化就是错误的: 第二中情况:不在定义指...
C/C++函数指针与指针函数等区别
(1)函数指针与指针函数(1)函数指针一种特殊的指针,它指向函数的入口;/* * 定义一个函数指针p,只能指向返回值为int,形参为两个int的函数 */ int (*p)(int,int);/* * 求最大值 * 返回值是int类型,返回两个整数中较大的一个 */ int max(int a, int b) { return a > b ? a : b; } /*
(Ⅰ)C语言用指针实现冒泡排序、strcat、strcmp、strstr库函数
使用指针冒泡排序 为了同数组冒泡排序进行区别,所以我们要用全指针实现冒泡排序 在一般的冒泡排序中 第一层for循环 规定要进行的趟数,循环条件为t&amp;lt;数组长度-1 第二层循环 从第一个元素开始进行相邻元素的交换,直到交换到上次已经交换结束的元素数,通过i&amp;lt;数组长度-1-t来决定每趟中要交换的次数 通过指针冒泡排序 如果指针也按照上述的方法来进行交换,那么会额...
C指针 - 用指针在函数间传递需要修改的数据
在主函数中定义的数据,不希望在函数中传来传去的,那就传递地址好了。不需要传参数本身,也不需要获取返回值,处理完马上就能用。小例子:#include &amp;lt;stdio.h&amp;gt; typedef struct DATA { int num; } data; typedef struct TEST { int *a; data *b; } test; int func(...
【C语言】malloc()和free()函数的讲解以及相关内存泄漏问题
1、函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。 关于分配失败的原因,应该有多种,比如说空间不足就是一种。 void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新
关于 printf函数 ,当参数是指针变量时,要不要带*号
这需要根据你的printf函数的参数来决定。 例一:printf(  “%d”,*p ); printf中的%d参数要求你提供一个整数,而p是个指针,它指向的是整数,这时用*p表示p指向的整数。如果你用p的话,将把指针的地址取值进行输出。 例二:printf(  “%s”,p ); printf中的%s参数要求你提供一个指针,而p就是一个指针变量,可以直接写变量名p 所以,参数使用时要满...
引用、指针、union
1.求下面函数的返回值( 微软) int func(x) { int countx =0; while(x) { countx ++; x = x&(x-1); } return countx; } 假定x = 9999。 答案:8 思路:将x转化为2进制,看含有的1的个数。 其实还是有规律的,发现每次当countx为2的整数倍时
gets输入指针
C语言中: #include int main() { char *ch; ch=(char*)malloc(10*sizeof(char));//10可以根据自己的需要修改,这里10代表10个字符,英文字母每个占一个字符,汉字每个站2字符 gets(ch); puts(ch); delete ch; return 0; } c++中: #include #inclu
子函数中为指针分配空间
#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;malloc.h&amp;gt; typedef struct node{ int data; struct node *next; }Node,*Linklist; void my_malloc(Linklist *node) { if(*node == NULL){ *node =...
C语言函数传参:如何实现指针参数引用传递
编程问题
C语言中“指针”作为“函数参数”时的注意事项
C语言中“指针”作为“函数参数”时的注意事项
C语言指针实现循环报数问题(简单约瑟夫环问题)
题目描述: 报数:有n个人围成一圈,按照顺序从1到n编好号。从第一个人开始报数,报到x(x&amp;gt;1)的人退出圈子,下一个人从1开始重新报数,报到x的人退出圈子。如此下去,直到留下最后一个人。问留下来的人的编号。试编写相应程序。 分析:利用指针的赋0后的特性解决, 赋0,即空指针,就是不指向任何对象,相当于 NULL地址为0的地址是不允许读写的,这是操作系统的保护机制, 所以约定用地址0...
C++中指针的引用——在函数中改变指针的值+linux下C++程序送入参数
问题的原因是,在对地址进行map的时候,发现封到函数中,不能改变地址的值, void BaseVirtMap(unsigned int *map_base,unsigned int *virt_addr) { int dev_mem_fd; if( ( dev_mem_fd = open( &quot;/dev/mem&quot;, O_RDWR | O_SYNC ) ) == -1 ) FATA...
C语言中结构体与指针的若干问题(在数据结构中的应用)
C语言中结构体与指针的若干问题(在数据结构中的应用)
C语言malloc和指针传递陷阱
最近写二叉树的基本操作的时候发现了这个问题,所以写了个简单的例子,做个笔记 下列初始化数组过程 #include &amp;lt;iostream&amp;gt; void init_array(int* arr,int size){ arr = (int*)malloc(sizeof(int) * size); for (int i = 0; i &amp;lt; size; ++i) { ...
函数形参中指针的指针
一、指针的指针     int *pi;      int **ppi;   //这是一个指向指针的指针,注意有两个*号      ppi=&pi;      解释:int **ppi;--申明了一个指针变量ppi,这个ppi是用来存储(或称指向)一个int * 类型指针变量的地址。      &pi那就是取pi的地址,ppi=&pi;就是把pi的地址赋给了ppi。即将地
关于指针作为函数返回值丢失值的问题
记录个小问题:定义了一个结构体:struct vertex//定义顶点结构体 { int v_id;//顶点编号 vector&amp;lt;string&amp;gt; attr;//顶点属性 vector&amp;lt;vertex*&amp;gt; edge;//边 int dist = INT_MAX;//用于计算最短距离时使用,表示距离查询顶点的最短距离 };接着定义了图:vertex ...
用指针调用实现strcpy的功能
#include&amp;lt;stdio.h&amp;gt;#include&amp;lt;string.h&amp;gt;#define N 100char my_strcpy(char *p1,char *p2) //指针变量!*p1、*p2{   while(*p2 != '\0') //终止条件 { *p1 = *p2; p1++; p2++; //p1、p2的地址往后移 } *p1=...
使用指针实现字符串的插入
/* 使用指针实现字符串的插入 */ #include #include char *insert(char *s,char *p,int n,char *t) { int i; for(i=0;*s!='\0';i++) { if(i==n-1) { for(;*p!='\0';) { t[i]=*p; i++;
c程序设计 第八章习题 用指针的指针排序和用指针排序
//用指向指针的指针给n个整数排序并输出 //将排序单独写成一个函数,n个整数从主函数输入,从主函数输出 #include void sort(int **p,int n); int main() { int i,n,num[20],*pnum[20],**p; printf("input the number(n):"); scanf("%d",&n); for(i=0;i<n
C# 调用C++DLL(函数参数包含指针)
C#调用C++DLL,C++DLL中的函数参数包含指针。 绝对可用。
《C和指针》第一章课后
1.C是一种自由形式的语言,也就是说并没有规则规定它的外观究竟应该怎样。但本章的例子程序遵循了一定的空白使用规则。你对此有何想法? C是一种自由形式的语言,也就是说并没有规则规定什么地方可以书写语句,一行中可以出现多少语句,什么地方应该留下空白以及应该出现多少空白等(预处理指令是个例外)。唯一的规则就是相邻的标记之间必须出现一至多个空白字符(或注释),不然它们可能被解释为单个标记,因此,下列语句是等
指针常见面试题
备注 还可参考数组一文和函数一文 数组:https://blog.csdn.net/wolf_break/article/details/78320138 函数:https://blog.csdn.net/wolf_break/article/details/78320460 指针相减 同一类型指针可以进行互减操作 int a[] = {2,4,5}; int *p...
Python中指针式传递的函数遇到的问题
最近在尝试通过 multiprocessing 把原来的计算核心改为通过多进程实现的并行程序,但碰到了一个非常奇怪的问题,经过一些时间的排查,终于找到了问题所在。虽然问题本身很简单,但也许也有一定典型性,尤其是对编程新手而言,因此在这里用最简单的模型重现一下。首先从下面一段非常简单的程序开始:def main(): x = [1, 2, 3, 4, 5] foo(x) pri
C++用指向函数的指针作为函数参数
示例: #include &amp;lt;iostream&amp;gt; using namespace std; int add(int x, int y){ return x + y; } int sub(int x, int y){ return x - y; } int operation(int x, int y, int(*function)(int, int)){ return func...
C语言面试题---指针篇(一)
原创2017-12-22创新教育研究中心TeachPlus                                                         C语言面试题---指针篇(一) 指针的使用,一直是c语言面试题中必考的部分, 因为指针本身使用的复杂性与普适性,所以考点非常多,而且也可以与其他知识相互结合, 因此我们将会使用五篇专题的篇幅来介绍指针。分析下面的程序
娓娓道来c指针 (0)c语言的梦魇:c指针
c语言中有一个重点:c指针。它也是一个难点。当然,这是一句废话:重点往往也是难点。在c标准中,对指针的定义是这样的: 指针的类型是derived from其它类型,也就是说指针的类型是由它指向的类型决定的; 指针是一种reference类型,即引用类型; c指针似乎很难理解,以至于有人指出:掌握了c指针,就掌握了c语言的精髓。本系列就来聊聊c指针,要想弄懂c指针。光就指针本身进行理解,还不够。 因为指针的本质就一句话:指针就是地址。这句话大多数学过c语言的人都明白,但对很多使用指针的场景仍然
关于子函数变量生命周期以及指针的一些问题
C语言的变量都有自己的生存周期,如果超过这个周期,那么它所占用的地址空间就会被释放掉。不再受到保护。因此主函数中要用到的变量不能再子函数里面申明。
文章热词 设计制作学习 统计学稳健估计opencv函数 机器学习教程 Objective-C培训 交互设计视频教程
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 区块链问题 java学习指针吗