C 언어에서 포인터 변수와 그룹 변수의 차이
C 언어에서 포인터 변수와 그룹 변수의 차이
우선 아래 코드를 보고 무엇을 출력할지 알아맞혀 보세요.
#include <stdio.h>
int main()
{
char s[] = "How big is it?";
char *t = s;
printf("%lu
", sizeof(s));
printf("%lu
", sizeof(t));
printf("%p
", s);
printf("%p
", t);
printf("%p
", &s);
printf("%p
", &t);
return 0;
}
output:
15
8
0x7fff5ab94af5
0x7fff5ab94af5
0x7fff5ab94af5
0x7fff5ab94ae8
이때 우리는
printf("%p
", s)
와 printf("%p
", t)
가 같은 값, 즉 수조 변수 s[]의 첫 번째 요소의 바늘 주소를 되돌려주는 것을 보았다.메모리에 있는 그룹의 시작 주소를 가리키는 바늘로 사용할 수 있음을 기억하십시오.기왕 이렇게 된 일부 동료들은 놀랄 수도 있는데, 왜
printf("%lu
", sizeof(s))
는 그룹의 시작 주소의 바늘 길이가 아닌 15 즉 문자열의 실제 길이를 되돌려 줍니까?이 경우 sizeof()
이 자동으로 깨닫고, 그룹 변수를 전달하면 문자열의 실제 길이를 되돌려줍니다.sizeof(&s)
를 사용하면 바늘의 길이가 되돌아오고 64비트 OSX에서 되돌아오는 수치는 8입니다.printf("%lu
", sizeof(t))
에서 char *t = s
의 할당 조작이 이루어졌는데 사실t
은 현재 뼈에 수조 변수s
의 첫 번째 원소의 바늘 주소를 저장하고 있다.sizeof
이것에 대해 실제 바늘 주소 길이만 출력하기 때문에 8이다.printf("%p
", &s)
와 printf("%p
", &t)
는 다르고 &s
는 s
수조 변수의 첫 번째 요소의 바늘 주소를 되돌려주기 때문&s == s
.&t
는 &s
에 해당하는 바늘 주소를 저장했지만 컴퓨터는 바늘 변수t
에게도 저장 공간을 분배한다는 것을 잊지 마라. 그래서 t
는 자신의 바늘 주소를 가지고 있다. 결과는 물론&t != t
이다.이렇게 GG라고 생각하지 마라. 그것들 사이에는 또 하나의 중요한 차이가 있다.
그룹 변수는 다른 곳을 가리킬 수 없습니다. 바늘 변수를 만들 때 컴퓨터가 저장 공간을 분배합니다.그럼 그룹 변수는요?
실제로 컴퓨터는 수조에 저장 공간만 분배하지만, 수조 변수에 저장 공간은 분배하지 않으며, 컴파일러는 수조 변수가 나타나는 곳에서 그것을 수조의 시작 주소로 바꾼다.
Over.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.