嗯我用指针做了很多工作,但现在我感到困惑。我正在尝试在字符串中创建指针数组(在这个例子中只有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 :(得分: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;
他们是一样的。
在图中,框表示值,它们的地址写在框之外。
使用变量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