C 指针和赋值,如何处理不同类型的指针和赋值?

C 指针和赋值,如何处理不同类型的指针和赋值?,c,pointers,C,Pointers,我正在做“艰苦学习C”的自学,因为我了解了一点Python。我读过好几本教程,但我不知道指针和作业是如何工作的。我理解,如果取消引用指针,可以直接给它一个值,如下所示: int *anint = 42; 但是具体地引用已经创建的变量的内存位置怎么样? 具体而言,我尝试: char *pointer_to_strlit; char *strlit = "some stuff"; pointer_to_strlit = &strlit; 执行此操作后,为什么以下情况会导致segfault

我正在做“艰苦学习C”的自学,因为我了解了一点Python。我读过好几本教程,但我不知道指针和作业是如何工作的。我理解,如果取消引用指针,可以直接给它一个值,如下所示:

int *anint = 42;
但是具体地引用已经创建的变量的内存位置怎么样? 具体而言,我尝试:

char *pointer_to_strlit;
char *strlit = "some stuff";
pointer_to_strlit = &strlit;
执行此操作后,为什么以下情况会导致segfault:

printf("I print strlit: %s\nI print it again by pointing to it: %s\nI print where the pointer is pointing: %p\n", strlit, *pointer_to_strlit, pointer_to_strlit);

C中的类型似乎很难判断它们的行为以及如何使用指针来引用特定的类型。是否有明确的指南专门概述指向每个不同数据类型的语法(
char
*char
*char[]
int
struct
void
null
,函数等)?即使是帮助我理解规则集的步骤列表也会很有用。

请坚持!经过更多的练习,指针会变得有意义。但当有疑问的时候,试着对每个值的含义进行推理。用钢笔和纸试着在内存中画出每个字节真的很有帮助

char*指向strlit的指针-这里声明一个指向字符的指针。您可能已经知道,C中的字符串由指向该字符串的第一个字符的指针表示。字符串应以null结尾。这意味着最终应该有一个ASCII
0
字符指示字符串已结束

char*strlit=“一些东西”-您的程序内存将包含此字符串的字符(准确地说是11个字符——10个字符表示您看到的文本,1个字符表示空终止符)。这里声明另一个指针,这次指向该字符串的第一个字符“s”

pointer_to_strlit=&strlit
-将
指针的值设置为指向指针
strlit
地址。这可能不是你想要的

如果事情变得混乱,试着把每个指针看作一个普通的旧数字——这就是指针的本质,一个巨大的数字代表内存中的地址。让我们再看看上面的内容:

char*指向strlit的指针-此处的
指针\u指向\u strlit
的值未定义,因为您尚未设置它

char*strlit=“一些东西”
-假设第一个“s”的地址是
1234500
strlit
的值将是该数字,
1234500

pointer_to_strlit=&strlit-但是strlit本身的地址是什么?它是另一个值,比如说
1234600
。指向strlit的
指针的值现在将是
1234600


现在,尝试将指向strlit的
指针打印为
%s
,您的程序将崩溃--地址
1234600
不是字符串的第一个字符,而是另一个数字--庞大数字中的一个字节,指针。代码将尝试遍历它认为是字符串的内容以查找空终止符,最终在到达不可访问内存时崩溃。

请稍候!经过更多的练习,指针会变得有意义。但当有疑问的时候,试着对每个值的含义进行推理。用钢笔和纸试着在内存中画出每个字节真的很有帮助

int *anint = 42;
char*指向strlit的指针-这里声明一个指向字符的指针。您可能已经知道,C中的字符串由指向该字符串的第一个字符的指针表示。字符串应以null结尾。这意味着最终应该有一个ASCII
0
字符指示字符串已结束

char*strlit=“一些东西”-您的程序内存将包含此字符串的字符(准确地说是11个字符——10个字符表示您看到的文本,1个字符表示空终止符)。这里声明另一个指针,这次指向该字符串的第一个字符“s”

pointer_to_strlit=&strlit
-将
指针的值设置为指向指针
strlit
地址。这可能不是你想要的

如果事情变得混乱,试着把每个指针看作一个普通的旧数字——这就是指针的本质,一个巨大的数字代表内存中的地址。让我们再看看上面的内容:

char*指向strlit的指针-此处的
指针\u指向\u strlit
的值未定义,因为您尚未设置它

char*strlit=“一些东西”
-假设第一个“s”的地址是
1234500
strlit
的值将是该数字,
1234500

pointer_to_strlit=&strlit-但是strlit本身的地址是什么?它是另一个值,比如说
1234600
。指向strlit的
指针的值现在将是
1234600

现在,尝试将指向strlit的
指针打印为
%s
,您的程序将崩溃--地址
1234600
不是字符串的第一个字符,而是另一个数字--庞大数字中的一个字节,指针。代码将尝试遍历它认为是字符串的内容以查找空终止符,最终在到达不可访问内存时崩溃

int *anint = 42;
42是整数文本,
anint
应该包含指向整数的地址,而不是整数本身

char *pointer_to_strlit;
char *strlit = "some stuff";    // Should be const char *strlit = "some stuff";
pointer_to_strlit = &strlit;    // Wrong
&strlit
给出指针地址(即char**),而
指向strlit的指针类型为char*。所以,应该是这样

pointer_to_strlit = strlit;
字符串文字位于只读位置。打开警告,编译器会给你一些好消息

int *anint = 42;
42是整数文本,
anint
应该包含指向整数的地址,而不是in
pointer_to_strlit = &strlit;
printf(
    "I print strlit: %s\n"
    "I print it again by pointing to it: %s\n"
    "I print where the pointer is pointing: %p\n", 
    strlit, *pointer_to_strlit, pointer_to_strlit
);