| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1724 人关注过本帖
标题:C语言指针问题
只看楼主 加入收藏
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 6楼 hkhk366
这样啊。办法肯定有:
1、楼主自创一个编译器,专门完成楼主的需求。
2、我可以完成,但不知道楼主看的懂不,代码如下,自己思索:
程序代码:
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <malloc.h>
using namespace std;

void reverse3(char *s)
{
    int len = strlen(s);
    int i,*p1;
    char *p = (char*)malloc(len);
    strcpy(p, s);
    p1=(int*)&s;
    i=0;
    while(p1[++i]!=*p1&&i<1000);
    p[1] = 's';
    s = p;
    if(i<1000)p1[i]=(int)s;
    cout << s << endl;
}

int main() {
    char *s = new char[4];
    s = "abc";
    reverse3(s);
    cout << s << endl;
    return 0;
}


能编个毛线衣吗?
2016-02-21 14:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
int main() {
     char *s = new char[4];
     s = "abc";               // 這句賦値已經把前面的s廢掉了,最後還弄出內存殘留無法釋放
     reverse3(s);
     cout << s << endl;
     return 0;
 }

而樓主原來的問題,的確是因爲"abc"存儲於祇讀內存區造成的,那無法更改。

授人以渔,不授人以鱼。
2016-02-23 13:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我不知道樓主的實驗意圖,1樓的程序,可以這樣實現:
程序代码:
char* s = new char[4];
strcpy(s, "abc");
reverse3(s);


也就是説,必須把在祇讀存儲區中的數據复製出來進行更改。但你要明白,這樣更改的祇是幻影,不是那個(The)被复製的數據"abc"本身。

授人以渔,不授人以鱼。
2016-02-23 13:47
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 13楼 TonyDeng
Tony指出的是。楼主最初的new出来的内存成为无用的残留了。
不过,我觉得楼主的主要问题还是传值和传地址的问题。像Tony版主说的那样,楼主在函数reverse3里已经strcpy了主函数里的"abc"到一个malloc出来的内存里,然后修改传进的参数指针s的指向,楼主自认为这样就修改了主函数的指针指向,返回后会显示他修改的字符串,实际上这是做不到的,除非他传进的参数是指针的地址(二级指针),像我在5楼的做法。不过楼主很固执,他非要用一级指针参数做到修改指针参数的指向,我只好在11楼通过在函数里查找主函数指针变量地址(好像内存修改器)来完成楼主的需求。

楼主在一楼的问题原文 :请问main函数的cout为什么输出abc而不是asc呢,应该如何让他输出asc呢,请用C语言,不要用string之类的东西,谢谢
楼主在6楼固执要求原文:这个问题必须用二级指针来做吗?没有别的办法吗?如果我限定函数名必须是void reverse3(char *s)而且不准用全局变量,而且main函数必须是char *s不能是char s[],没有别的办法吗?谢谢啊

能编个毛线衣吗?
2016-02-23 15:46
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
他就是想改外面的字符串"abc",在祇讀區是改不了的。當然,有人在某個版本或個別的系統中用非正常手段“改到”了,那是另一回事。

授人以渔,不授人以鱼。
2016-02-24 17:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
就他1樓那樣,在reverse3()中返回p,在main()中輸出其返回値,就可以看到期望的輸出,至於是否達到真正目的,他自己才知道。兩處洩漏內存的事就不説了,單説要表面看到輸出結果,像他那樣硬編碼該指定位置爲特定字符,其實根本不用多次申請內存,直接逐字符輸出就是了——在特定位置輸出自己想輸出的東西,改都不用改,包括那些拼接字符串之類的作業,都可以這樣。不看實現手段,祗看結果的,都這樣瞞天過海,所以我一直説就題做題沒什麽意義,因爲所有實現手段都可以不考慮後續操作和整體協調,這樣的題目,會做一萬條都不頂用,一到綜合課題,沒一招可以連貫起來用,但最可怕的是平時自以為會了。

授人以渔,不授人以鱼。
2016-02-24 18:10
快速回复:C语言指针问题
数据加载中...
 
   



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

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