好吧,我并没有经常使用指针,但现在我很困惑。我正在尝试在字符串处创建指针数组(在此示例中只有 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;
它们是一样的。
在图中,方框代表值,它们的地址写在方框旁边。
当您使用变量 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 &
再一次,当您编写 myptr_arr[0]
时,它会转换为
*(myptr_arr + 0)
*(20152000 + 0)
这将为您提供 0x20162000
即名为 [0]
的框的值 = varA
的地址。现在要获取此地址的值,您需要使用 *
运算符取消引用它。
*myptr_arr[0]
与 * ( *(myptr_arr + 0) )
相同
与 *(0x20162000)
相同
这是框 varA
关于C 字符串指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37199390/