原以为我对指针理解透了,今天最到个了问题,想了好大一会才明白!
char content[]="helloworld";
void func (char *str){
//在这写你的代码
}
void main(){
char *str;
func(str);
printf("%s\n",str);
}
问题可以归纳为上面的程序:有没有办法仅仅在func里写代码,使得main里的str指向content,输出content的字符??
如果可以,请写出程序,如果不行,请说明为什么~~
[解决办法]
vs2008 release版,禁用优化的话,下面代码是可以楼主要求的的,跟栈的布局有关……
这种代码不同编译器编译出来的东西会有不同行为,没必要深究
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语言接口与实现>.
#include<stdio.h>char content[]="helloworld";void func (char **str) {//在这写你的代码 *str = content;}int main() { char *str; func(&str); printf("%s\n",str);}
[解决办法]
#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不是同一个变量
char content[]="helloworld";void func (char *s){ //把func函数中的参数改下能好理解一些。。//在这写你的代码}void main(){char *str;func(str);printf("%s\n",str);}
[解决办法]
+1
#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);}
[解决办法]
这个高,学习啦,宏可以用到这来啦!
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里少打了个分号。
[解决办法]
想要从本质上理解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;
}