2013-10-23 3 views
1
char *x[4] = { "ffg", "fgf", "kkk" "mmm"}; 
int *x1[4] = { 1, 2 ,3 , 4}; 

내가 정수 포인터의 배열을 만드는 경우 두 번째 줄에 언급 된 반면, 그 나는 오류만들기 문자 포인터의 배열 및 정수 포인터

'initializing' : cannot convert from 'int' to 'int *' 
을 얻고 잘 컴파일 위에서 언급 한 바와 같이 나는 문자 포인터의 배열을 만드는 경우

구문이 문자에 대해서는 잘 작동하지만 정수에서는 작동하지 않습니다. 누구든지 설명해주십시오. 1int 입력 갖는 반면

"ffg"
+0

정수 포인터의 배열을 초기화하기 위해 다른 리터럴, 즉 0을 사용하면 혼동을 일으킬 수 있습니다. 0이 포인터로 변환되기 때문입니다. 실제로 정수 포인터의 배열을 가지지 않았습니까?당신이하려는 것은 무엇입니까?) – Damon

+0

음, 구문이 문자에 대해 잘 작동하지 않습니다. 문자 버전은'char * x [4] = { 'f', 'f', 'g'};'이고'int' 버전과 같은 문제가 있습니다. –

답변

10

1char* 입력 갖는다 (하지int*). 지금이 문제를 보길 바랍니다.

: 음, 기술적으로는 it's char[4] in C입니다. 그러나 이것은 암시 적으로 char*으로 붕괴합니다. C++에서 유형은 const char[4]이고 get a warning or an error from the compiler이어야합니다.

+4

나는''ffg '''const char [4]' – juanchopanza

+1

@juanchopanza를 가지고 있다고 확신했다. 누군가가 뛰어 들어서 고쳐 줄 것이라고 확신했지만, 당신은 매우 빨랐다. :) 혼란에 가담하지 않고 그것을 어떻게 바꾸는 것이 가장 효과적인지 생각해 봅시다. – NPE

+1

배열 액세스에 []가 사용되는 컨텍스트에서 [1]을 (를) 사용하는 것은 불필요하게 혼란 스럽습니다. 노트를 인라인으로 넣거나 각주없이 메모 만하십시오. –

2

1, 2 ,3 , 4ints에 대한 포인터가 아닙니다. 당신이 할 수도 있습니다. 이 같은 주조 :

int *x1[4] = { (int *)1, (int *)2 ,(int *)3 , (int *)4}; 

는 오류가 있지만 해제 참조가 UB의 원인이됩니다 멀리 갈 수 있도록 할 것이다.

int i1=0, i2=0, i3=0, i4=0; 
int *x1[4] = { &i1, &i2, &i3, &i4 }; 

리터럴 스트링 (같은 "ffg", "fgf" 등)

읽기 전용 위치 (구현에 의존적)에 보관하고 char [] 입력 갖는다. 당신이 C++ 태그 때문에

, 당신은 시도 할 수 있습니다 :

#include <iostream> 
#include <typeinfo> 

int main() 
{ 
    char arr [5] = "test"; 
    char *arr1 = "test"; 
    std::cout << typeid(arr).name() << std::endl; 
    std::cout << typeid("test").name() << std::endl; 
    std::cout << typeid(arr1).name() << std::endl; 
} 

출력 : NPE가 말한대로 그 형태가 char[5]의하지만 당신이 포인터로 문자열 리터럴 붕괴를 볼 수 있듯이

A5_c 
A5_c 
Pc 

.

+0

문자열 리터럴이 읽기 전용 메모리에 저장되는지 여부는 구현에 따라 다릅니다. –

+0

@ShafikYaghmour - 명확한 주셔서 감사합니다 :) – Sadique

3
는이 작업을 수행 할 수 int *x1[4] = { 1, 2 ,3 , 4};, 당신이 당신의 배열에 정수 포인터를 저장하는 대신 정수 포인터의 정수를 저장하고 여기 것이며 진행하는 것

방법 : 포인터의 배열에 대해 아무 문제가 없습니다

int *x1[4] ; 
int i , j , k , l; 
x1[0] = &i; 
x1[1] = &j; 
x1[2] = &k; 
x1[3] = &l; 
+0

@EricB 배열이 int보다 큰 범위에 있다고 생각할 이유가 없습니다. – juanchopanza

0

. 나는 컴파일러가 당신에게 말하는 것을 이해하는데 실패했다고 생각한다.

구문에는 아무런 문제가 없습니다. 그것은 좋지 않은 의미입니다.

{1, 2, 3, 4}int[4]이지만이 값을 int*[4]으로 지정하면 불가능합니다.

오류는 initializing 오류입니다. 구문 분석기는 코드에서 괜찮 았지만 의미 분석기는 intint*과 같지 않기 때문에 아닙니다.