C 字符串指针数组

标签 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]);
}

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

所以你能用字符串上的指针帮助我理解所有这些情况吗?请

最佳答案

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

例如:

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

表示数组 my_arr 有 6 个元素,从索引 0 开始到 6-1 (5)。因此,一个 N 元素数组的索引将从 0 到 N-1。另外,请注意 my_arr 本身也是一个指向数组的指针。

定义一个整型指针:

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

关于C 字符串指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37199390/

相关文章:

c++ - 在列表小部件 Qt C++ 中显示数组内容

php - 在选择首先替换字符串部分的顺序时替换字符串

c - 指针算术和 malloc()/calloc() 函数

c++ - 当我取消引用指针并将值分配给某个变量时,内存会发生什么情况?

c++ - 为什么 reinterpret_cast 不能将 int 转换为 int?

java - 如何从 JNI 中的 GetDirectBufferAddress 调用多种数据类型?

c++ - 如何以编程方式缓慢移动窗口,就好像用户正在做一样?

c - 如何循环更新 GtkProgressBar?

c - 将天数添加到日期中

ios - 空数组导致我的应用程序在 Swift 中崩溃