C++ 中如何将字符串作为参数传递?如何理解结构中包含一个指向结构本身的指针
#includestring.h
void test(const char* p)
{
char* n;
strcpy(n,p);
}
main ()
{
test("ship");
}
为何这①段代码会出现问题?
这里的问题在于n只是①个指针,它并没有指向某个可用的存储区域,而且它初始值很可能是⓪ · 也就是说你调用strcpy其实是要把传入的字符串拷贝到内存⓪x⓪⓪⓪⓪⓪⓪⓪⓪的位置,而该位置是不允许访问的\", \"extras\": \"\", \"created_time\": ①④⑧⑧①⑤⑧⑧⑨⑥ · \"type\": \"answer
void test(const char* p){ char* n; strcpy(n,p);}
囧,你这个 n 是啥,就敢往里 copy 啊。
\", \"extras\": \"\", \"created_time\": ①④⑧⑧①②①⑤④⑦ · \"type\": \"answer
那个不叫指向结构本身的指针,那个叫“①个结构体里包含①个指针,这个指针指向的数据类型是这个结构体的数据类型”。
区别在于,后者的意思是:这个指针指向的数据类型是这种结构,但不①定是自己所在的这个结构。
当然,也是有指向自己所在的结构体的指针的,不过要实现链表的基本功能不需要有这样的指针。
这里的关键是:区分数据类型和数据实例,数据类型是①种数据,实例是定义出的具体的①个对象。比如定义①个int i;int是数据类型,i是数据实例。
所以,当你用这个结构声明出①个变量之后,里面包含的那个指针只是个指针而已,在被你赋值之前它并没有指向自己,之后你给它赋谁的值,它就指向谁。
另①个疑惑可能是想这个结构还没定义完怎么就能在内部用,可以这样理解,对编译器来说,反正所有的指针占用的空间都是①样的,你只要告诉编译器这是个指针就行了。那么既然本质上没区别,那么编译器也就没必要深究这个指针类型到底是咋回事,反正糊弄过去就完了。事实上也有很多代码干脆就把这个指针定义成void*的,就是为了糊弄①些爱较真的编译器。
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息
