读书人

原以为小弟我对指针理解透了,今天最到

发布时间: 2012-08-09 15:59:21 作者: rapoo

原以为我对指针理解透了,今天最到个了问题,想了好大一会才明白!

char content[]="helloworld";

void func (char *str){
//在这写你的代码
}

void main(){
char *str;
func(str);
printf("%s\n",str);
}


问题可以归纳为上面的程序:有没有办法仅仅在func里写代码,使得main里的str指向content,输出content的字符??

如果可以,请写出程序,如果不行,请说明为什么~~

[解决办法]
vs2008 release版,禁用优化的话,下面代码是可以楼主要求的的,跟栈的布局有关……
这种代码不同编译器编译出来的东西会有不同行为,没必要深究

C/C++ code
char content[]="helloworld";void func (char *str){    char **t=(char **)&str;    *(++t)= content;}void main(){    char *str;    func(str);    printf("%s\n",str);    getchar();}
[解决办法]
你这样是不能的,
main 函数中的
str是字符指针,
content可以是字符数组,
content 指向第一个字符, 如果用字符串输出, 他会看到‘\0'字符才停的。
这不好说的, 我给你修改一下


char content[]="hello world!\n";

int fun(char *str_addr[]) {
*str_addr = content;
return 1;
}

int main(int argc, char *argv[]) {
char *str = NULL;
fun(&str);
printf("%s", str);
return 1;
}
[解决办法]
我做不到,C里函数参数传递是按值复制到栈上的,func函数里所见的str只是一份副本,返回后main里的str还是str.
这个问题与指针无关.更没多大意义.

关于指针的好书推荐<C语言接口与实现>.
C/C++ code
#include<stdio.h>char content[]="helloworld";void func (char **str) {//在这写你的代码    *str = content;}int main() {    char *str;    func(&str);    printf("%s\n",str);}
[解决办法]
探讨

我做不到,C里函数参数传递是按值复制到栈上的,func函数里所见的str只是一份副本,返回后main里的str还是str.
这个问题与指针无关.更没多大意义.

关于指针的好书推荐<C语言接口与实现>.
C/C++ code
#include<stdio.h>
char content[]="helloworld";
void func (char **str) {
//在这写你的代码……

[解决办法]
C/C++ code
#include<stdio.h>#include<stdlib.h>char content[]="helloworld";void func (char *str){//在这写你的代码    #define func(str) (str = content)}int main(){    char *str;    func(str);    printf("%s\n",str);        system("pause");    return 0;}
[解决办法]
main里面的str 跟 func里面的str不是同一个变量

C/C++ code
char content[]="helloworld";void func (char *s){  //把func函数中的参数改下能好理解一些。。//在这写你的代码}void main(){char *str;func(str);printf("%s\n",str);}
[解决办法]
+1

探讨

C/C++ code

#include<stdio.h>
#include<stdlib.h>

char content[]="helloworld";

void func (char *str){
//在这写你的代码
#define func(str) (str = content)
}

int main()
{
char *str;
func(str);
……

[解决办法]
这样子可以。要修改参数。
C/C++ code
#include <stdio.h>#include <stdlib.h>char content[] = "helloworld";void func(char** str){    *str = content;}int main(void){    char** str = malloc(sizeof (char*));    func(str);    printf("%s\n", *str);}
[解决办法]
这个高,学习啦,宏可以用到这来啦!
探讨


+1


引用:

C/C++ code

#include<stdio.h>
#include<stdlib.h>

char content[]="helloworld";

void func (char *str){
//在这写你的代码
#define func(str) (str = content)
}

int main()
{
……


[解决办法]
请问复制到栈上,栈上是指什么意思?
探讨
我做不到,C里函数参数传递是按值复制到栈上的,func函数里所见的str只是一份副本,返回后main里的str还是str.
这个问题与指针无关.更没多大意义.

关于指针的好书推荐<C语言接口与实现>.

C/C++ code
#include<stdio.h>
char content[]="helloworld";
void func (char **str) {
//在这写……

[解决办法]
请大侠指教,char**p在哪学习?
探讨
这样子可以。要修改参数。

C/C++ code
#include <stdio.h>
#include <stdlib.h>

char content[] = "helloworld";
void func(char** str)
{
*str = content;
}

int main(void)
{
char** str = malloc(si……

[解决办法]
探讨
char content[]="helloworld";

void func (char *str){
//在这写你的代码
}

void main(){
char *str;
func(str);
printf("%s\n",str);
}

问题可以归纳为上面的程序:有没有办法仅仅在func里写代码,使得main里的str指向content,输出content的字符?……

[解决办法]
林锐 高质量 c\c++ 编程
[解决办法]
vs2008 debug版,
C/C++ code
char content[]="helloworld";void func (char *str1){    //在这写你的代码    char** p;    _asm    {        mov eax, ebp        add eax, 0xdc        mov [ebp-8],eax    }    *p = content;}void main(){    char *str = {"asd"};    func(str);    printf("%s\n",str);}
[解决办法]
用二级指针。你要是看看Glib,就会发现很多这么用的。
我的func里少打了个分号。
[解决办法]
探讨

9楼的。。。。。
void func (char *str){
#define func(str) (str = content)
}

你把的的func改成了,到底它现在是函数还是宏啊??我不清楚啊!!

[解决办法]
我认为不可以。
char content[]="helloworld";这个字符串是在堆内存上的

而main()里面声明的char *str;是一个动态变量,
通过void func (char *str)这个函数,传递的是值,这个值是一个地址(存放字符串的地址)
作为地址的这个值,只能通过实参传递给形参,实际上实参没有被初始化,而无法通过形参传递给实参
虽然这个值本身是一个指针,但是其作为一个函数参数,在传递的时候仍然遵守值传递
如果需要把地址传递回来,那么就需要void func (char **str)这样一个形式的函数,
不知道楼主是否能够理解我的意思。

另外,任何依赖于编译器行为的代码,都是危险的。
C的代码需要的是严谨。
[解决办法]
我觉得这样是不行的,感觉需要一个 void fun(char *&str) 或者 void fun(char **str)这样的函数才行。还有就是不通过参数获得主函数中str的地址,这个好像涉及到C的函数调用约定。或者根据栈来寻找,这个就要看编译器了。
个人观点。
[解决办法]
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)


想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

[解决办法]
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

char content[]="helloworld";

void func (char *str)
{
//在这写你的代码
strncpy(str,content,strlen(content));
}

int main()
{
char *str;
func(str);
printf("%s\n",str);
return 0;
}

不过很危险
[解决办法]
#include <iostream>
#include <string>

using namespace std;

char *pszContent = "Hello world!";

void func(char *pszValue)
{
strcpy(pszValue, pszContent);
}

void func1(char **pszValue)
{
*pszValue = new char[strlen(pszContent)+1];
strcpy(*pszValue, pszContent);
}

int main()
{
// First method
char szValue[32] = {0};
func(szValue);
cout << szValue << endl;

// Second method
char *pszValue = NULL;
func1(&pszValue);
cout << pszValue<< endl;
delete[] pszValue;

return 0;
}

读书人网 >C语言

热点推荐