지침을 이해하다

변수의 본질: 모든 변수가 저장된 것은 수다.이 수는 정수나 소수일 수 있다.메모리 주소는 정수다.우리는 메모리 주소를 저장하는 변수를 지침이라고 할 뿐이다.
#include<stdio.h>
#include<stdlib.h>

void test(char *p) 
{
        *p = 3;
}
int main()
{
        char *q; 
        q = malloc(4 * sizeof(int));
        *q = 1;
        test(q);
        printf("%d
", *q); return 0; }
이해 지침: 이해의 관건은 전송된 지침 인삼은 복사하여 분배하는 것이다. 하위 함수는 인삼 0x1을 복사하여 다시 창고에 넣고 함수가 끝난 후에 창고를 방출한다.하지만!함수체에서 우리의 조작 대상은 메모리 주소 0x1 내의 수입니다.그래서 마지막 0x1 형식의 매개 변수가 방출되었음에도 불구하고 우리의 조작은 여전히 유효하다.
바늘의 바늘: 만약 이 저장된 주소의 공간에 또 하나의 메모리 주소가 존재한다면 이 변수를 바늘의 바늘이라고 부른다.같은 이치에 바늘이 있는 바늘의 바늘...언어 묘사는 이해하기 어렵지만, 이렇게 간단한 일을 나타낸다.
#include<stdio.h>
#include<stdlib.h>

char* test1()
{
	char *s = (char *)malloc(40*sizeof(char));
	*(s+1) = 100;
	printf("test1() in function:%d
",*(s+1)); return s; } int test2(char *p)//the memory leak here.. { p = (char *)malloc(40*sizeof(char)); *(p+1) = 100; printf("test2() in function:%d
",*(p+1)); return 0; } int test3(char **p)//(*p) is a pointer. { *p = (char *)malloc(40*sizeof(char)); *(*p+1) = 100; printf("test3() in function:%d
",*(*p+1)); return 0; } int main() { char *p,*q,*w; p = test1(); printf("%p
",p); printf("test1() in main:%d

",*(p+1)); printf("test2() in main before:%d
",*(q+1)); test2(q);//nothing happen.. printf("%p
",q); printf("test2() in main after :%d

",*(q+1)); test3(&w); printf("%p
",w); printf("test3() in main:%d
",*(w+1)); return 0; }

테스트 1에서 바늘이 되돌아오는 값으로 되돌아옵니다.
테스트 2에서 바늘q의 백업을 복사했다. 즉, 바늘 변수(주소를 저장하는 변수)를 복사해서 매개 변수로 전송했다. 함수 테스트 2에서 메모리 공간을 분배하고 첫 번째 주소를 바늘 변수에 부여했다. 여기서 바뀐 것은 바늘 값일 뿐 원래의 메모리 공간은 영향을 받지 않았다.
테스트 3에서 w의 주소를 복사하여 변수로 전송하였고 테스트 3에서 메모리 공간을 분배하였으며 이 메모리 공간의 첫 번째 주소를 바늘이 가리키는 변수, 즉 바늘 w에 값을 부여하였다.

좋은 웹페이지 즐겨찾기