を、いや、利点はありません。 a[i]
は既に基本的にa + (sizeof(int) * i)
です。ポインタを使用したとしても、配列の末尾から離れないようにするには、やはりすべてのカウントを行う必要があります。
多くの場合、長さがわからない文字列などのポインタのヌル終端配列が便利です。しかし、実際にはパフォーマンスに関するものではありません。以下に見られるように、彼らはおおよそ同じことをしなければなりません。
char string[] = "foo bar";
// Allocate and initialize i.
// `string + i` twice, compare, increment.
for(int i = 0; string[i] != '\0'; i++) {
printf("%c", string[i]);
}
puts("");
// Allocate and initialize s.
// Dereference s twice, compare, increment.
for(char *s = string; *s != '\0'; s++) {
printf("%c", *s);
}
puts("");
ポインタによる繰り返し処理は、複数の手順で配列を反復処理する必要がある場合に便利です。元の配列のポインタと最後のインデックスを渡す代わりに、関数のシグネチャをすべて変更して、インクリメントされたポインタを渡し、インクリメントされたポインタを返すだけです。これにより、文字列の途中で標準の文字列関数を使用することができます。
#include <stdio.h>
char *findVal(char *string, char delim) {
char *val = string;
for(; *val != '\0' && *val != delim; val++) {
}
if(val == '\0') {
return NULL;
}
else {
// val is sitting on the ':'
return val+1;
}
}
int main() {
char string[] = "this:that";
char *val = findVal(string, ':');
if(val != NULL) {
// Just use val, not string[valIdx].
printf("%s\n", val);
}
}
これはまた安全です。オフセットには、同期していなければならない2つのもの、つまりポインタとオフセットがあります。誤ったオフセットが誤ったポインタとともに使用される可能性があります。インクリメントされたポインタはそのオフセットを持ちます。
コメントで指摘したように、あなたがそうのような第二のループを引き締めることができます。
int b[count];
for (i = 0; i < count; i++) {
b[i] = 1;
}
あなたは、カウントを知っていれば、特定の指標のうち、抽出する必要はありません。 for(i = 0; i
@EastonBornemeierああ、そうです。ご意見ありがとうございます。 – Syoung
あなたの問題は何ですか?わかりません。 – Stargateur