字符串上指针的C数组
嗯,我不经常使用指针,但现在我感到困惑。我正在尝试在字符串处创建指针数组(在本例中只有两个指针)字符串上指针的C数组,c,arrays,pointers,C,Arrays,Pointers,嗯,我不经常使用指针,但现在我感到困惑。我正在尝试在字符串处创建指针数组(在本例中只有两个指针) charstr[120]; char*st[2]; int i=1; while(fgets(str,120,f)){ printf(“%s”,str); st[i]=&str; i++; 如果(i==3) 打破 } 对于(i=1;i数组,始终使用基于0的索引 例如: int my_arr[] = { 10, 11, 12, 13, 14, 15 }; 意味着数组my_arr有6个元素,从索引0到
charstr[120];
char*st[2];
int i=1;
while(fgets(str,120,f)){
printf(“%s”,str);
st[i]=&str;
i++;
如果(i==3)
打破
}
对于(i=1;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.
或
它们是一样的
在图中,框代表值,它们的地址写在框的旁边
当您使用变量i
作为索引遍历数组时,基本上可以间接执行以下操作:
i = 0
my_arr[i]
与
my_arr[0]
与
*(my_arr + 0)
与相同(替换名为my_arr的框的值)
*运算符获取本例中地址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\u arr[0]
时,它会转换为
*(myptr_arr + 0)
*(20152000 + 0)
这将获得0x20162000
,即名为[0]
的框的值=varA
的地址。现在要获得此地址的值,需要使用*
运算符取消对其的引用
*myptr_arr[0]
这与*(*(myptr\u arr+0))相同
与*(0x20162000)
这是boxvarA
请参阅:数组始终使用基于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.
或
它们是一样的
在图中,框代表值,它们的地址写在框的旁边
当您使用变量i
作为索引遍历数组时,基本上可以间接执行以下操作:
i = 0
my_arr[i]
与
my_arr[0]
与
*(my_arr + 0)
与相同(替换名为my_arr的框的值)
*运算符获取本例中地址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\u arr[0]
时,它会转换为
*(myptr_arr + 0)
*(20152000 + 0)
这将获得0x20162000
,即名为[0]
的框的值=varA
的地址。现在要获得此地址的值,需要使用*
运算符取消对其的引用
*myptr_arr[0]
这与*(*(myptr\u arr+0))相同
与*(0x20162000)
这是boxvarA
请参阅:st[i]
是一个char*
,或者是一个字符的指针。&str
是一个char(*)[120]
,或者是一个120个字符的数组的指针。注意它们是不同的。所以我需要将&str更改为str,当我这样做时,我得到了这个:12 1211��!�� ��!��inti=0;
。st[i]=strdup(str);
。if(i==2)
。for(i=0;第二件事是使用st[1]
和st[2]
st[1]
是stst[2]中的第二个元素
是st中的第三个元素,它有两个元素长,因此没有第三个元素。@immibis现在我知道了,索引对指针指向器非常重要,这很有趣。如果你能写一个关于指针数组如何工作的答案就好了st[i]
是一个char*
,或者是一个字符指针。&str
是一个char(*)[120]
,或者是一个120个字符数组的指针。注意它们是不同的。所以我需要将&str更改为str,当我这样做时,我得到了这个:12 1211��!�� ��!��inti=0;
。st[i]=strdup(str);
。if(i==2)
。for(i=0;第二件事是使用st[1]
和st[2]
st[1]
是stst[2]中的第二个元素
是st中的第三个元素,它有两个元素长,因此没有第三个元素。@immibis现在我知道了,索引对pointeer非常重要,这很有趣。如果你能写一个关于指针数组如何工作的答案就好了