2017-01-21 20 views
0

我有这样的代码:指针数组是否等于一个字符数组?

import std.stdio; 
import std.string; 

void main() 
{ 
    char [] str = "aaa".dup; 
    char [] *str_ptr; 
    writeln(str_ptr); 
    str_ptr = &str; 
    *(str_ptr[0].ptr) = 'f'; 
    writeln(*str_ptr); 
    writeln(str_ptr[0][1]); 

} 

我认为我创建的指针char [] *str_ptr的阵列,使得每一个指针将指向单个char。但它看起来像str_ptr指向字符串str的开始。我必须做出决定,因为如果我试图访问(例如)writeln(str_ptr[1]);,我得到了很多关于控制台输出的信息。这意味着我正在链接到边界之外的元素。

任何人都可以解释它是否是一个指针数组,如果是的话,在这种情况下指针数组是如何工作的?

+1

'char [] *'是指向数组的指针,而不是指针数组。 –

+0

@Adam,D中的指针数组应该是什么样子? –

+0

看到我的答案,它就像'char * []'。 –

回答

2

你想要实现的事情要容易得多:只需索引char数组本身。不需要经过明确的指针。

import std.stdio; 
import std.string; 

void main() 
{ 
    char [] str = "aaa".dup; 
    str[0] = 'f'; 
    writeln(str[0]); // str[x] points to individual char 
    writeln(str); // faa 
} 

在d阵列已经在里面的指针 - 它包含一个指向它的元素,并且索引它可以让你的单个元素。 str[1]导致第二个字符(请记住,它从零开始),与*(str.ptr + 1)完全相同。事实上,编译器会生成那个代码(尽管默认情况下加上范围边界检查D,所以它会中止而不是给你乱码)。唯一需要注意的是数组必须访问内存中的顺序元素。这是D中的T[]

如果指针数组全部指向不同的地方,则可能会使用指针数组,这些指针不一定按顺序排列。也许你想要第一个指针指向最后一个元素,第二个指向第一个元素的指针。或者也许它们都是分配的元素,比如指向对象的指针。 D中正确的语法是T*[] - 从右到左读取“指向T的指针数组”。

指向数组的指针在D中很少见,它是T[]*,但当需要更新另一个函数持有的其他数组的长度时,可以使用它。例如

int[] arr; 
int[]* ptr = &arr; 
(*ptr) ~= 1; 
assert(arr.length == 1); 

如果ptr不是一个指针,arr长度将不被更新:

int[] arr; 
int[] ptr = arr; 
ptr ~= 1; 
assert(arr.length == 1); // NOPE! fails, arr is still empty 

但是指针数组是有关修改长度阵列的,也可能是指向一些全新的东西,并更新原件。没有必要在其中共享单个元素。