C 언어에서 포인터 변수와 그룹 변수의 차이

1835 단어

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)
는 다르고 &ss 수조 변수의 첫 번째 요소의 바늘 주소를 되돌려주기 때문&s == s.&t&s에 해당하는 바늘 주소를 저장했지만 컴퓨터는 바늘 변수t에게도 저장 공간을 분배한다는 것을 잊지 마라. 그래서 t는 자신의 바늘 주소를 가지고 있다. 결과는 물론&t != t이다.
이렇게 GG라고 생각하지 마라. 그것들 사이에는 또 하나의 중요한 차이가 있다.
그룹 변수는 다른 곳을 가리킬 수 없습니다. 바늘 변수를 만들 때 컴퓨터가 저장 공간을 분배합니다.그럼 그룹 변수는요?
실제로 컴퓨터는 수조에 저장 공간만 분배하지만, 수조 변수에 저장 공간은 분배하지 않으며, 컴파일러는 수조 변수가 나타나는 곳에서 그것을 수조의 시작 주소로 바꾼다.
Over.

좋은 웹페이지 즐겨찾기