2013-01-10 2 views
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로 코딩 한 이후로 꽤 오랜 시간이 걸렸으므로 확실한 실수는 볼 수 없습니다.

누군가 지적 해주십시오.

+5

함수에 전달하면, 어쨌든 배열 포인터를 "붕괴". 그런 게임을하면 더 효율적으로 만들지 못할 것입니다. – dmckee

+2

배열 의미를 학습하는 시간 –

+0

이것은 유용한 자료가 될 수 있습니다. [C Book - Arrays, & 연산자 및 함수] (http://publications.gbdirect.co.uk/c_book/chapter5/arrays_and_address_of.html). 제가 가장 좋아하는 C 레퍼런스 중 하나입니다. – detly

답변

6

포인터를 통해 전달하지 않을 수도 있습니다. 인수에서 유형을 사용하면 어쨌든 포인터가되고 간접 참조의 두 번째 레벨은 덜 효율적입니다. 당신이 표기 '배열 포인터'를를 사용하는 경우

는, 당신은 올바른 우선 순위를 얻기 위해 괄호가 필요합니다

if ((*param)[i] ...) 
    ... 
+0

+1 그리고 답은 고마워요. – Mawg

1

//이 OK입니다 : 배열은 "숯불 *"로 취급 될 수있다 , 그 반대의 경우 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 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] .... 
+1

함수에 대한 매개 변수가 단지'MyFunc (myString param)'대신에'MyFunc (myString * param)'일 때 표기법과 효율성 모두에서 차이가 있습니다. –

2

myString * 256 요소, 즉와 문자 배열에 대한 포인터입니다 :로 또는 "형식 정의"없이 동일

이 너무 :

마지막으로, 여기에 타입 정의와 같은 프로그램입니다 , param

char (*)[256] 

그래서 당신이 후, 처음 역 참조 param에있는 그 요소에 액세스 유형이있다.

  1. param을 참조 해제하면 배열 param이 가리키는 첫 번째 요소의 주소가 나타납니다.
  2. (*param)[i]은 해당 배열의 i 번째 요소입니다. 아래