찾다

 >  Q&A  >  본문

c++ - 遍历数组时遇到的一基础问题?

int a[] = {1, 2, 3, 4, 5};
for (int i = 0; i < sizeof(a) / sizeof(int); i++)
{

}

这里的a不是代表指针吗?为什么sizeof(a)得到的大小和指针的大小不一样?是因为这个是const指针吗?还是涉及到指针和数组名的本质区别?谢谢大家。

PHP中文网PHP中文网2809일 전756

모든 응답(3)나는 대답할 것이다

  • 迷茫

    迷茫2017-04-17 15:25:56

    배열과 포인터는 두 가지 유형이 있습니다.
    배열 이름은 암시적으로 첫 번째 요소에 대한 포인터로 변환될 수 있습니다.
    a의 유형은 int[5]이고, sizeof(a)sizeof(int[5]) 대신 sizeof(int *)과 동일합니다.

    회신하다
    0
  • 黄舟

    黄舟2017-04-17 15:25:56

    배열 포인터와 일반 포인터 사이에는 여전히 차이가 있습니다. 결국 배열을 정의할 때 해당 요소 유형과 개수를 결정할 수 있습니다.

    컴파일러가 배열인지 일반 포인터인지 유추할 수 없는 경우에만 일반 포인터의 크기를 기준으로 계산합니다. sizeof
    예를 들어 함수 선언에서 void f(int* a)은 모든 포인터는 a Enter 매개변수로 전달될 수 있습니다. 컴파일러가 배열인지 여부를 추론하는 것은 불가능합니다
    . 따라서 sizeof(a) = sizeof(int*)

    그러나 귀하의 질문의 경우 컴파일러는 a이 5요소 정수 배열임을 명확하게 추론할 수 있으므로 sizeof(a) = sizeof(int[5])

    회신하다
    0
  • 迷茫

    迷茫2017-04-17 15:25:56

    간단히 말하면 본질적인 차이점은 다음과 같습니다.
    변수 이름은 메모리 영역의 이름이며 런타임에는 이름이 없습니다. a와 p는 소스 코드와 컴파일 시간에만 의미가 있습니다.
    a라는 메모리는 5개의 정수를 포함하는 int[5] 유형의 메모리 조각입니다.
    p는 int 유형의 int 포인터가 하나만 있는 메모리 공간으로 명명됩니다.
    a[2]는 컴파일 중에 해당 메모리 공간의 세 번째 단위로 직접 변환됩니다.
    p[2]는 p로 변환되고 int* 메모리 공간의 값을 꺼내고 2를 추가하여 메모리 공간의 메모리 주소를 가져옵니다.
    int const p는 p가 가리키는 메모리 공간을 불변의 int 포인터 하나만 갖도록 제한합니다.

    회신하다
    0
  • 취소회신하다