문제

#include <cstring>
int main()
    {
    char *pName = new char[10];
    char dummy[] = "dummy";
    strcpy(pName + 0,dummy);//how this is different from -->this works
    strcpy(pName[0],dummy);//this one...--> error C2664: 'strcpy' : 
                           //cannot convert parameter 1 
                           //from 'char' to 'char *'

    }
도움이 되었습니까?

해결책

  • pname [0]은 문자 배열의 첫 번째 요소입니다 (하나 캐릭터)
  • pname은 & pname [0]의 바로 가기입니다 (배열의 첫 번째 요소에 대한 포인터)

당신이 당신의 오류를 얻는 이유는 strcpy가 char (char*)에 대한 포인터를 기대하기 때문입니다.

다른 팁

C 또는 C ++의 포인터 및 배열을 다룰 때는이를 매우 뚜렷한 구성으로 인식하는 데 도움이됩니다 (이 차이를 설명하는 최고의 책 중 하나는 내가 올바르게 기억한다면 "Deep C Secrets"라는 책이라고 생각합니다). 물은 어드레 디스 (Muddies)가 배열에서 포인터 (언어의 가변 이름 처리에 불일치)가 허용되는 원한 무음 변환이 있다는 사실입니다. 등가.

이에 대한 이유를 돕기 위해 '메모리 셀'이라는 아이디어를 소개하겠습니다. 우리는 '메모리 셀'을 두 가지 속성으로 모델링합니다.

a) value
b) address

그런 다음 간단한 C ++ 변수를 두 가지 속성을 갖는 것으로 모델링 할 수 있습니다 (이 낮은 추상화 수준에서 유형이 필요하지 않음).

c) name  
d) memory cell

대부분의 모델과 마찬가지로 일부 결함이 있습니다 (하나 이상의 요소가있는 배열을 다루지 않지만 목적에는 충분합니다).

예를 들어 :

// non-array variable: name 'i', and memory cell: value=3, address=0x0A
int i = 3;

// non-array variable: name 'p', and memory cell: value=0x0A, address=0x0B
int *p = &i;

// array variable: name 'a', and memory cell: vale=4, address=0x0C     
int a[1] = { 4 };

// non-array variable: name 'b', and memory cell: value=0x0C, address = 0x0D
int (*b)[1] = &a;

// non-array variable: name 's', and memory cell: value=0x0C, address = 0x0E
int *s = &a[0];


// non-array variable: name 't', and memory cell: value=0x0C, address = 0x0F
int *t = a; // Here is the key difference! read on...

이제 배열 변수와 비 어레이 (포인터) C ++ 변수의 주요 차이점은 다음과 같습니다.

C ++의 변수 이름이 평가되면 항상 한 가지 예외로 메모리 셀의 값으로 평가됩니다. 변수의 이름이 배열 변수의 이름을 지정하는 경우.
변수가 배열의 이름 인 경우 주소 메모리 셀의.
위의 두 줄은 다시 읽을 가치가 있습니다.

다음은 그 의미를 명확히하는 데 도움이되는 몇 가지 예입니다 (위 변수 참조).

int k = i;  // the 'i' name evaluates to the value of its cell, so 'k' is set to 3

int *q = p; // 'p' evaluates to the value of its cell, so 'q' is set to 0x0A

int *r = a; // 'a' evaluates to the *address* of its cell, so 'r' is set to 0x0C

int (*c)[1] = b; // 'c' is set to 0x0D

이것은 결코 배열 변수가 같은 포인터 변수로.
그들은 본질적으로 다른 유형과 그것들을 같은 (즉, 변수 이름을 한 번역 유닛의 배열로 정의하고 다른 번의 포인터로 정의하면 나쁜 일이 발생합니다.

예를 들어, 예를 들어 :이 작업을 수행하지 마십시오.

// myproj_file1.cpp
int array[100] = { 0 }; // here 'array' evaluates to the *address* of the first memory cell

// myproj_file2.cpp
extern int* array; // here 'array' evaluates to the *value* of the first memory cell 
            // Assuming the linker links the two
            // what it does if you read the assembly, is something like this: 
            // extern int* array = (int*) array[0];
            // but it doesn't have to, it can do anything, since the behavior is undefined

이게 도움이 되길 바란다. 여전히 추가 설명이 도움이 될 수 있다고 생각되면 후속 질문을하고 주저하지 말고 "Deep C Secrets"책의 사본 (도서관?)을 받으려면 :)

--
PS 기능 유형과 그 이름과 붕괴는이 게시물의 대부분과 관련이 없습니다.
추신 나는 또한 배열이 참조 유형에 바인딩 될 때 배열-포인터 변환이 발생하지 않는다는 의도적으로 빠져 나갔다.

기술적으로 strcpy(pName[0], dummy); 맞지 않습니다. 메모리가 할당 되더라도.

이 때문입니다 pName[0] 'char'유형입니다 pName + 0 char*입니다. 둘 다 같은 기억을 언급하지만 다른 방식으로 언급합니다.

그런 다음 컴파일러를 돌릴 수 있습니다 strcpy(pName[0], dummy); ~ 안으로 strcpy((char*) pName[0], dummy); 위험한 암시 적 캐스트입니다. 컴파일러가 절반 정도 인 경우 경고 또는 오류가 발생합니다 ( "오류 C2664"로 볼 때).

다른 점이 없다. PNAME의 공간을 할당하지 않았기 때문에 둘 다 충돌합니다. :) [편집 : 더 이상 충돌하지 않음 - 질문이 편집되었습니다

주요 차이점은 문체로, 주변 코드가 작성되는 방식에 자주 영향을받는 스타일입니다. 대부분 배열 액세스 또는 대부분 포인터 액세스.

(편집 : Brian Bondy가 지적한대로 당신이 정말로 의미하고 pname [0]을 의미한다고 가정합니다.)

배열은 자동으로 할당 된 메모리 블록에 자동으로 (보통) 포인터입니다. 예를 들어, 더미를 다음과 같이 선언 할 수 있습니다.

char    dummy[] = "dummy";
char    *dummy = "dummy";

그런 다음 배열 구문 또는 포인터 구문을 사용하여 데이터에 액세스 할 수 있습니다.

char    ch = dummy[0];   // get the first element of the array
char    ch = *dummy;     // get the data pointed to by dummy

둘 다 [] 그리고 * 회의를 다시 참조 할 수 있습니다. 포인터 및 배열은 다음과 같습니다.

array[N];
*(ptr + N);

두 번째 형태가 주어지면 (ptr + N) 배열을 따라 더 이상 포인터입니다. 그렇기 때문에 예제에서 구문 적으로 정확한 이유입니다. ptr[N] 포인터의 참조 중심이며 숯입니다 (이 맥락에서).

pname은 새로 할당 된 메모리에 대한 포인터입니다. char *pName = new char[10];

더미는 또한 배열/포인터입니다. char dummy[] = "dummy";

pname은 포인터이며 기본 주소를 가리키고 있습니다. 심지어 추가 (pname + 0)도 여전히 동일한 메모리 위치를 가리키고 있습니다. strcpy(pName + 0,dummy);

strcpy 사용 포인터 변수 및 첫 번째 인수에서의 전달 값이 있으므로 오류가 발생합니다. strcpy(pName[0],dummy)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top