定义char和int时指针有什么区别?

时间:2016-03-13 23:44:30

标签: c++ pointers

我理解指针如何工作的基础知识,但以下示例让我感到困惑。

int *myNum = 10; // Produces an error

char *myChar = "Something"; // Works fine

为什么分配char工作但整数没有(可能导致char被视为数组)?

在直接分配指针变量时,是什么让我感到困惑,它会自动获取地址吗?

char *myChar = "Something";

char myChar = "Something";
char *charAddr = &myChar;

这里有什么区别,或等于?

5 个答案:

答案 0 :(得分:20)

"Something"

基本上是简称:

static const char some_hidden_array[] = {'S', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g', '\0'};
some_hidden_array

也就是说,当您编写"Something"时,编译器会在后台生成一个数组,并为您提供指向该数组开头的指针。由于这已经是一个指向char的指针,因此您可以将它分配给类型"指向char"的指针的变量。 (写作char*)。

10
对于类似的东西,

不是 的缩写。它只是数字10 - 它不是指向包含数字10的数组的指针,或类似的东西。

请注意,char单个字符,而不是字符串,这就是为什么字符串语法与大多数其他类型相比不常见 - 字符串几个 chars,而不仅仅是一个。如果您尝试使用普通的char,您会看到同样的事情:

char *myChar = 'a'; // error

或任何其他类型:

float *myFloat = 42.1f; // error

换句话说,10给出错误并不奇怪 - 如果有的话,"Something" 不会很奇怪>。 (至少,在你知道字符串文字如何工作之前,这很奇怪)

答案 1 :(得分:10)

这是同样的事情(编译器没有发生任何魔法)。默认情况下,像10这样的文字是int值,而不是int *。

你需要施放:

int *myNum = (int*)10; // Need to cast
char *myChar = "Something"; // No need to cast "..." is already a char*

请注意,引用指向绝对值的指针是很危险的,因为你最终会得到CPU内存中的地址10。

关于你的第二个问题,“......”在内存中被视为一个连续的char序列,类似于数组,相当于char *。

为了深入理解C,数组和指针之间的指针和差异,你应该读一下:专家C编程:Peter van der Linden的深层C秘密。

答案 2 :(得分:2)

执行 <div id="section1"> <h1><London></h1> <p>London is the capital city of England. It is the most populous city in the United Kingdom, with a metropolitan area of over 13 million inhabitants</p> </div> <div id="section2"> <h2><London></h2> <p1>London is the capital city of England. It is the most populous city in the United Kingdom, with a metropolitan area of over 13 million inhabitants</p> </div> </div> #section1 { float:center; padding:5px; background-color:lime; margin-left:20px; width:300px; } #section2 { float:right; background-color:lime; margin-left:10px; width:300px; } 时,在内存中的某处创建一个只读字符串文字,以空字符结尾。现在这对于编译器来说是特殊的,它解释了一连串存储的'char'变量,并以null字符作为字符串结尾。所以基本上你创建了一个字符数组,当你执行char *myChar = "Something";时,它会返回字符串。

对于整数或任何其他数据类型,它将*myChar*区分为整数,将int *ptr区分为整数。您收到错误可能是因为您输入的地址可能无效/可用。

另外,做

int ptr

请注意,char myChar = "Something"; //this is an error, since char can hold one character char *charAddr = &myChar; myChar是相同的,因为&myChar是一个指针!

编辑:请参阅此处有关字符串文字的信息: Is it possible to modify a string of char in C?

答案 3 :(得分:2)

  

为什么分配char工作但整数没有(可能导致char被视为数组)?

你是对的,"Something"是一个字符串文字,可以视为char数组。在char *myChar = "Something";之后发生以下事情:它被分配 length + 1 字节的内存,其中"Something"将被存储,myChar指向此的起始地址记忆。字符串文字有些特殊。

以下是使用常量值初始化数组的一般方法:

// valid initializations;
char s2[] = { 'a', 'b', 'c' };
int a[] = { 1, 2, 3 };
char s1[] = "123";
  

在直接分配指针变量时,是什么让我感到困惑,它会自动获取地址吗?

查看8.5.2 Character arrays of c++ docs

答案 4 :(得分:1)

虽然理论上第一个## .... LBB0_1: ## =>This Inner Loop Header: Depth=1 movl -4(%rbp), %edi callq __Z11RecFunctioni jmp LBB0_1 ## .... 是有意义的 - 特别是如果你知道在地址十处有一个有用的int *myNum = 10它通常很少有用并且可能非常危险。

但是,某些指针分配被广泛使用且非常安全:

int

在99.9%以上的现代CPU架构中,这与

相同
int *myNum = 0;

请参阅int *myNum = NULL; here中的NULL定义。

作为一般规则,指针变量的赋值最好通过设置其他内容的地址来完成。

<stddef.h>