首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C中,带有两个星号(**)的变量声明意味着什么?

在C中,带有两个星号(**)的变量声明意味着什么?
EN

Stack Overflow用户
提问于 2010-11-30 21:30:14
回答 4查看 52.7K关注 0票数 65

我和C一起工作,我有点生疏了。我知道*有三种用途:

声明pointer.

  • Dereferencing a pointer.

  • Multiplication

但是,当变量声明前有两个星号(**)时,这意味着什么:

代码语言:javascript
复制
char **aPointer = ...

谢谢,

史考特

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-30 21:31:04

它声明一个指向char 指针指针。

使用这样的指针可以做这样的事情:

代码语言:javascript
复制
void setCharPointerToX(char ** character) {
   *character = "x"; //using the dereference operator (*) to get the value that character points to (in this case a char pointer
}
char *y;
setCharPointerToX(&y); //using the address-of (&) operator here
printf("%s", y); //x

下面是另一个例子:

代码语言:javascript
复制
char *original = "awesomeness";
char **pointer_to_original = &original;
(*pointer_to_original) = "is awesome";
printf("%s", original); //is awesome

在数组中使用**

代码语言:javascript
复制
char** array = malloc(sizeof(*array) * 2); //2 elements

(*array) = "Hey"; //equivalent to array[0]
*(array + 1) = "There";  //array[1]

printf("%s", array[1]); //outputs There

数组上的[]运算符本质上是在前端指针上执行指针运算,因此,计算array[1]的方法如下:

代码语言:javascript
复制
array[1] == *(array + 1);

这是数组索引从0开始的原因之一,因为:

代码语言:javascript
复制
array[0] == *(array + 0) == *(array);
票数 52
EN

Stack Overflow用户

发布于 2010-11-30 21:41:18

C和C++允许使用指向指针的指针(例如,5倍快)。看看下面的代码:

代码语言:javascript
复制
char a;
char *b;
char **c;

a = 'Z';
b = &a; // read as "address of a"
c = &b; // read as "address of b"

变量a保存一个字符。变量b指向内存中包含字符的位置。变量c指向内存中包含指向内存中包含字符的位置的指针的位置。

假设变量a将其数据存储在地址1000 (注意:示例内存位置完全组成)。假设变量b将其数据存储在address 2000,变量c将其数据存储在地址3000。鉴于所有这些,我们有以下内存布局:

代码语言:javascript
复制
MEMORY LOCATION 1000 (variable a): 'Z'
MEMORY LOCATION 2000 (variable b): 1000 <--- points to memory location 1000
MEMORY LOCATION 3000 (variable c): 2000 <--- points to memory location 2000
票数 47
EN

Stack Overflow用户

发布于 2010-11-30 21:32:46

这意味着aPointer指向一个char指针。

所以

代码语言:javascript
复制
aPointer: pointer to char pointer

*aPointer :pointer to char

**aPointer: char

使用它的一个例子是创建一个动态的c#字符串数组。

char **aPointer = (char**) malloc(num_strings);

aPointer给出了一个字符,它可以用来表示一个以零结尾的字符串.

代码语言:javascript
复制
*aPointer = (char*)malloc( string_len + 1); //aPointer[0]
*(aPointer + 1) = (char*)malloc( string_len + 1); //aPointer[1]
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4318881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档