字符串上的C数组指针

时间:2016-05-13 00:17:01

标签: c arrays pointers

嗯我用指针做了很多工作,但现在我感到困惑。我正在尝试在字符串中创建指针数组(在这个例子中只有2个指针)。

    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 个答案:

答案 0 :(得分:2)

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

例如:

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

表示数组my_arr有6个元素,从索引0到6-1(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)

*运算符会为您提供此示例中地址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