我学校的任务如下:
创建一个函数,该函数将以指向指针******str
的指针和指向char
的char作为指针。 / em>
Follow the white rabbit!
尽管我已经学到了关于指针的所有知识,但是我对C还是陌生的。.(
我想出了以下代码:
void mx_deref_pointer(char ******str);
它确实输出跟随白兔子,但是我认为这是不正确的,因为注释掉大多数功能仍会产生相同的结果。另外,我不知道如何将NULL以外的任何内容传递给mx_deref_pointer()。和我一起学习的一些人提出了不同的mx_deref_pointer:
#include <stdio.h>
#include <stddef.h>
void mx_deref_pointer(char ******str) {
char *pstr1, **pstr2, ***pstr3, ****pstr4, *****pstr5;
str = &pstr5;
pstr5 = &pstr4;
pstr4 = &pstr3;
pstr3 = &pstr2;
pstr2 = &pstr1;
pstr1 = "Follow the white rabbit!";
printf("%s", pstr1);
}
int main() {
char ******pstr6 = NULL;
mx_deref_pointer(pstr6);
}
它似乎有效,但是没有人能向我解释它是如何工作的。如果有人可以为此提供适当的代码,并且更重要的是解释它的作用和方式,我将不胜感激!
谢谢。
答案 0 :(得分:3)
为符合函数的参数(指向char
的6x指针),指向char的5x指针的地址可以是调用者提供的参数(或指向char的6x指针的值,您可以选择,只要它们引用的是有效数据即可。因此,您拥有的所有那些堆叠指针都属于调用方(main
),而不属于函数。简而言之,函数和main
应该看起来像这样:
#include <stdio.h>
void mx_deref_pointer(char ******str)
{
static char msg[] = "Follow the white rabbit!";
*****str = msg;
}
int main()
{
char *ptr1 = NULL;
char **ptr2 = &ptr1;
char ***ptr3 = &ptr2;
char ****ptr4 = &ptr3;
char *****ptr5 = &ptr4;
mx_deref_pointer(&ptr5);
puts(ptr1);
return 0;
}
输出
Follow the white rabbit!
请注意,为避免意外的未定义行为,分配将保存包含字符串的非常量缓冲区的基地址。从技术上讲,您的编译器必须允许这样做:
void mx_deref_pointer(char ******str)
{
*****str = "Follow the white rabbit!";
}
但是这样做是不好的做法,因为调用者可能期望可修改的字符串。字符串文字是不可写的,并且将其存储在char *
中将允许代码写入该字符串,而编译器不会发出任何警告。因此最好在返回之前将文字复制到可写数组中。
关于数组语法取消引用链的工作方式,给定一些非空类型的指针p
,它们是等效的:
p[n] == *(p+n)
因此,它们是等效的:
p[0] == *(p+0)
但是*(p+0)
就是*p
。因此:
void mx_deref_pointer(char ******str)
{
static char msg[] = "Follow the white rabbit!";
*****str = msg;
}
等效于此:
void mx_deref_pointer(char ******str)
{
static char msg[] = "Follow the white rabbit!";
str[0][0][0][0][0] = msg;
}
答案 1 :(得分:2)