0

継承されたコードと、文字配列をパラメーターとして受け取る関数があります。

typedef char myString[256];

void MyFunc(myString param)
{
  int i;

  for (i = 0; i < 256; i++)
  {
     if (param[i] ....

これをより効率的にして、char 配列へのポインターを渡したいと思います。

void MyFunc(myString *param)
{
  int i;

  for (i = 0; i < 256; i++)
  {
     if (*param[i] <========= Thsi is wrong

配列要素を参照しようとすると、間違った値が得られるため、ポインターの逆参照に明らかに問題があります。C でコーディングしてからしばらく経っているので、明らかな間違いは見当たりません。

誰かがそれを指摘できますか?

4

4 に答える 4

6

おそらく、ポインターを介して渡したくありません。引数で型を使用すると、とにかくポインターになり、第 2 レベルの間接化は効率が低下します。

「配列へのポインター」表記を使用する場合は、優先順位を正しくするために括弧が必要です。

if ((*param)[i] ...)
    ...
于 2013-01-10T03:44:28.967 に答える
2

myString *256 個の要素を持つ char 配列へのポインタです。つまり、param型があります

char (*)[256]

したがって、最初に逆参照してからparam、その要素にアクセスする必要があります。

  1. param を逆参照することで、配列がparam指す最初の要素のアドレスを取得しました。
  2. (*param)[i]は、問題の配列の i 番目の要素です。
于 2013-01-10T03:53:00.183 に答える
1

char myString[256]; // これで問題ありません。配列は「char *」として扱うことができ、その逆も可能です。 char myString[256];

void MyFunc(char * param)
{
  int i;

  for (i = 0; i < 256; i++)
  {
     if (param[i] ...

Q: これをもっと効率的にして、char 配列へのポインタを渡したい

A: "param[]" を渡しても "*param" を渡しても、効率にまったく違いはありません。

for (i = 0; i < 256; i++)
  {
     if (*param[i] <==== <========= Thsi is wrong

うん - それは間違っています。ここでも、" param[]" と " *param" は同じように扱われるべきです。

「typedef」の有無にかかわらず同じです:)

最後に、typedef を使用した同じプログラムを次に示します。

typedef char myString[256];

void MyFunc(myString param) 
// This is treated as "MyFunc(char param[256])" 
// It is *identical* to "MyFunc(char * param)"
{
  int i;

  for (i = 0; i < 256; i++)
  {
     if (param[i] ....
于 2013-01-10T03:49:26.493 に答える
0

以下のように使用:

if (*(param +i) ...)
...
于 2013-01-10T05:20:55.560 に答える