2016-04-08 4 views
-2

プログラム内でポインタをまったく使用していないにもかかわらず "式にオブジェクト型へのポインタが必要" 行にエラーが発生しましたプログラムでポインタをまったく使用していないにもかかわらず、 "式にオブジェクト型へのポインタが必要"エラー

#include<stdio.h> 

int main() 
{ 
    int j = 0, key, i=0; 

    char l = 'r', al = {"abcdefghijklmnopqrstuvwxyz"}; 

    while (l != al[j]) 
     j++; 

    key = j - i; 

    return 0; 
} 
+0

あなたは「a1 [j]」とは何を意味しますか? –

答えて

0

alは、charの配列またはcharのポインタのいずれかとして宣言する必要があります。 、配列として宣言し、次の操作を行います。

char l='r', 
    al[] = "abcdefghijklmnopqrstuvwxyz"; // braces not required here, 
              // array size is computed from 
              // length of string literal 

ポインタとしてそれを宣言するには、あなたは配列としてalを宣言すると、コンパイラは店に脇に十分なストレージを設定します

char l='r'; 
const char *al = "abcdefghijklmnopqrstuvwxyz"; 

を使用文字列"abcdefghijklmnopqrstuvwxyz"のコピーで、この配列の内容は変更可能です(長さは固定されますが、新しい要素を追加したり、配列から既存の要素を削除することはできません)。

ポインタとしてalを宣言すると、コンパイラは文字列リテラルの最初の文字のアドレスをポインタにコピーします。文字列リテラルの内容を変更しようとすると、未定義の動作になります。 がコードをクラッシュさせたり、クラッシュさせる可能性があります。原則としてリテラル文字列を指すように何かを宣言した場合、あなたはそれconst宣言したい:あなたが誤って

al[0] = 'z'; 

ような何かを書く場合には、この方法で

const char *al = "abcdefghijklmnopqrstuvwxyz"; 

コンパイラはそれをキャッチし、診断を発行する。

[]サブスクリプト演算子は、配列式とポインタ式の両方で動作しますので、l != al[j]テストは両方の場合に同じように動作します。それはsizeofまたは単項&演算子のオペランドであるか、または宣言に配列を初期化するために使用されるリテラル文字列である場合を除き


1、表現型の "TN -elementアレイ"は" Tへのポインタ "の式に変換(" decay ")され、式の値は配列の最初の要素のアドレスになります。"

1

ポインタを使用していないことが問題です。これは、alが1つの文字ではなく、ポインタ型または配列型のいずれかでなければならないためです。宣言

char l='r', 
    al = { "abcdefghijklmnopqrstuvwxyz" }; 

あなたは、単一のchar値にalを宣言しているが、あなたはcharの配列で文字列リテラル、とそれを初期化しようとしているで

0

あなただけcharまたはcharの配列へのポインタを初期化することができ、文字列リテラル、とcharを初期化しようとしています。下の1はal配列になりながら

のいずれか、このエラーを修正

char l='r', 
    *al = { "abcdefghijklmnopqrstuvwxyz" }; 

または

char l='r', 
    al[] = { "abcdefghijklmnopqrstuvwxyz" }; 

までにあなたのコードを変更するには、上の文では、alポインタます。

関連する問題