2016-05-13 118 views
0

嗯,我不会用指针工作很多,但现在我感到困惑。我试图创建字符串指针数组(在这个例子中只有2个指针)。字符串上的指针C数组

char str[120]; 
    char* st[2]; 
    int i=1; 
    while (fgets(str,120,f)) { 

    printf("%s",str); 
    st[i]=&str; 

    i++; 
    if (i==3) 
     break; 
} 
for (i=1;i<=2;i++) { 
    puts(st[i]); 
} 

警告:从兼容的指针类型[默认启用]

分配,以便你能帮助我了解有一个字符串指针,这一切情况。请

+1

'ST [I]'是'字符*',或一个指向角色的指针。 '&str'是一个char(*)[120]',或者一个指向120个字符数组的指针。注意那些是不同的。 – immibis

+0

所以我需要改变&str str,当我这样做时,我得到了这个:12 ! ! –

+0

'int i = 0;'..'st [i] = strdup( str);''if(i == 2)'..'for(i = 0; i <2; i ++){' – BLUEPIXY

回答

2

数组始终使用从0开始的索引。

例如:

int my_arr[] = { 10, 11, 12, 13, 14, 15 }; 

意味着数组my_arr具有从索引0开始直到6-1 6个元件(5)。所以,一个N元素数组的索引从0到N-1。另外请注意,my_arr本身也是一个指向数组的指针。

限定INT指针:

int *iPtr = my_arr; // note that we do not use &my_arr here. my_arr is already a pointer to the array it defined. 

int *iPtr; 
iPtr= my_arr; 

它们是相同的。

Array and Pointer in Memory

在图中,框所代表的价值和它们的地址除了框写入。

当您使用变量i作为索引遍历数组时。你基本上做间接如下:

i = 0 
my_arr[i] 

是相同

my_arr[0] 

是相同

*(my_arr + 0) 

是一样的(替代命名my_arr框的值)

*(20014000+0) 

*运算符让你的VA在此示例中的地址0x20014000处为10

上述操作也一样

iPtr[0] or *(iPtr+0) 

看看命名iPtr盒子,它也包含相同的值0x20014000

现在,让我们定义一个指针数组:

int *myptr_arr[3]; 
int varA = 25; 
int varB = 34; 
int varC = 67; 

myptr_arr[0] = &varA; // note that varA is not a pointer, to get its address use & 
myptr_arr[1] = &varB; // note that varB is not a pointer, to get its address use & 
myptr_arr[2] = &varC; // note that varC is not a pointer, to get its address use & 

enter image description here

再次,当你写myptr_arr[0]将其转换为

*(myptr_arr + 0) 

*(20152000 + 0) 

这将让你0x20162000即价值框名为[0] =地址varA。现在要获取此地址的值,您需要使用*运算符对其进行解引用。

*myptr_arr[0] 

其是相同* (*(myptr_arr + 0)) 其是相同*(0x20162000) 这是框varA

的值,请参见:Example usage of pointers