변수, 포인터, 개체 및 메모리 주소 : 왜이 ​​이상한 결과를 얻습니까?

StackOverflow https://stackoverflow.com/questions/802717

  •  03-07-2019
  •  | 
  •  

문제

그들이 어떻게 작동하는지 이해했다고 생각한 후, 나는 이것을 시도했다.

NSString *str1 = [NSString stringWithCString:"one"];
NSString *str2 = [NSString stringWithCString:"two"];
NSLog(@"str1: %x, %@", &str1, str1); //bfffd3cc, one
NSLog(@"str2: %x, %@", &str2, str2); //bfffd3c8, two

str1 = str2;
NSLog(@"str1: %x, %@", &str1, str1); //bfffd3cc, two

포인터 (str1, str2와 같은)의 값은 메모리 주소입니다. 그 주소로 이동하면 객체가 저장되는 메모리의 "영역"에 도달합니다.

그러나 : str2에 str1에 할당 할 때 str1은 str2에서 참조하는 것과 동일한 객체의 메모리 주소를 값으로 가져야합니까? 여기서 이상한 점은 포인터의 값이 동일하게 유지되며 (BFFD3CC 메모리 주소) 그 주소 뒤에있는 것이 바뀌는 것입니다. 메모리 주소가 물체 (또는 메모리 벽돌의 대상의 집)라고 생각하기 때문에 그것은 실제로 나에게 완전히 무제한입니다.). 그래서 나는 이것을 기대했다 :

NSString *str1 = [NSString stringWithCString:"one"];
NSString *str2 = [NSString stringWithCString:"two"];
NSLog(@"str1: %x, %@", &str1, str1); //bfffd3cc, one
NSLog(@"str2: %x, %@", &str2, str2); //bfffd3c8, two

str1 = str2;
NSLog(@"str1: %x, %@", &str1, str1); //bfffd3c8, two

그렇지 않으면, 나는 여전히 요점을 얻지 못했습니다. "포인터 변수"의 값과 "실제 값"사이의 관계는 해당 메모리 주소 뒤에 앉아있는 객체라고 가정합니다.

도움이 되었습니까?

해결책

포인터 변수는 변수 자체이므로 주소가 있습니다. 그래서 &str1 포인터 변수의 주소가 발생하고 str1 포인터 변수가 보유하고있는 모든 것을 초래하는 표현입니다.

그것을 가정합니다 :

  • NSString "One"을 고정하는 객체는 주소 0x00000100에 있습니다.
  • NSString "Two"를 고정하는 객체는 주소 0x00000200에 있습니다.

그러면 포인터가 다음과 같이 보일 수 있습니다.

초기화시 :

str1
0xbfffd3c8  +---------------+
            |               |
            |  0x00000100   |
            |    ("one")    |
            +---------------+

str2
0xbfffd3cc  +---------------+
            |               |
            |  0x00000200   |
            |    ("two")    |
            +---------------+

=======================================

str1 = str2; 과제:

str1
0xbfffd3c8  +---------------+
            |               |
            |  0x00000200   |
            |    ("two")    |
            +---------------+

str2
0xbfffd3cc  +---------------+
            |               |
            |  0x00000200   |
            |    ("two")    |
            +---------------+

다른 팁

포인터의 값이 아닌 포인터의 주소 인 포인터의 참조를 인쇄하고 있습니다.

&str1 포인터의 주소를 취합니다.

좋아, 우리가 기억의 일부 주소에서 모든 것을 "살아"라고 말한 것을 기억하십니까? 그리고 그 포인터는 숫자, 주소 인 숫자입니까?

글쎄, 포인터도 사물입니다 그들 주소가 있습니다.

인쇄 할 때 &str1, 당신은 포인터가 차지하는 메모리를 인쇄하고 있습니다. 인쇄 할 때 str1, 당신은 포인터의 값을 인쇄하고 있습니다. 이것은 메모리 주소입니다. ~를 가리키다.

인쇄 할 때 *str1 포인터를 인쇄하고 인쇄하고 있습니다 저것 값을 지적한 인쇄.


우연히도, 좋은 일 : 나는 마지막 두 가지 질문을 읽었으며, 당신은 그것을 얻고 있으며, 당신의 이해가 정확하다는 것을 증명하거나 반증하기 위해 당신의 신용 작문 코드에 있습니다. 이것이 바로 당신이해야 할 일이며, 당신은 올바른 길을 가고 있습니다.

당신이 가지고있는 문제의 일부는 문자열이 재미있는 것들이라는 것입니다. 문자열은 실제로 (const) 문자의 배열이며, nslog와 같은 기능은 char에 대한 포인터로 일반적인 일을하도록 작성되며, 이는 인쇄하는 것입니다. 끈. 문자열에 대한 포인터가 주어지면 실제로 루핑입니다. 포인터를 디포 링하고, 포인터를 인쇄하고, 포인터에 하나를 추가하고, 다음 문자를 인쇄하고, 다음 문자를 인쇄합니다. 문자열의 끝을 발견하고 문자 인쇄를 중지합니다.

ints 및 pointers와 같은 것을 Ints에 사용하면이 모든 것을 이해하기가 더 쉽다는 것을 알 수 있습니다.

Pointers는 실제로 전용 산술이있는 정수입니다 (IIRC, sizeof (int) == sizeof (void*)가 보장됩니다).

포인터를 참조하면 주소가 저장된 주소를 얻을 수 있습니다. 변수가 자동 인 경우 포인터가 저장된 스택에서 주소가 표시됩니다. 그래서 해당 결과를 얻는 이유입니다.

과제는 정수 사이의 과제처럼 행동합니다. 사실은:

#include <stdio.h>

int main() {
        char *str1 = "Ciao";
        char *str2 = "Mondo";
        printf("%x\n", str1);
        printf("%x\n", str2);
        str1 = str2;
        printf("%x\n", str1);
}

인쇄물:

:~$ ./a.out
80484f8
80484fd
80484fd

str1 A에 대한 포인터입니다 NSString 값.

&str1 수단 : 주소 str1 변하기 쉬운. 이것은 이중 간접입니다.

나는 당신이 가치의 주소를 원한다고 생각합니다. str1 그 자체가 아닙니다 &str1.

그것을 가정합시다 NSString 객체 값을 포함합니다 @"one" 주소에 있습니다 0x12345678 그리고 @"two" 에 있습니다 0x1234ABC0.

처음에는 값입니다 str1 ~이다 0x12345678 그리고의 가치 str2 ~이다 0x1234ABC0. 이 두 값은 각각 주소로 메모리에 저장됩니다. 0xbfffd3cc 그리고 0xbfffd3c8. 이것들은 주소입니다 str1 그리고 str2 변수, 즉 값 &str1 그리고 &str2.

당신이 쓸 때 str1 = str2, 할당은 값을 변경합니다 str1 값과 동일합니다 str2, 즉, 가치 str1 그렇다면 0x1234ABC0. 이것은 주소입니다 @"two" 물체. 그러나 주소 str1 변수 (0xbfffd3cc)는 변경되지 않았습니다.

Objective-C의 객체는 포인터를 사용하여 작업합니다. 따라서 NSString 객체를 처리하려면 포인터를 가져 가야합니다. 이것이 STR1은 NSString 객체에 대한 포인터입니다.

NSString에 메시지를 보내려면 구문 [str1 dosomething]을 사용할 수 있습니다.

문자열을 인쇄하려면 포인터를 NSLOG로 전달하고 NSLOG에 포인터가 NSSTRING을 가리키며 서식 규칙 "%@"에 의해 수행된다고 말해야합니다.

이제 STR1에 의해 지적 된 주소를 인쇄하려면 여전히 포인터 str1을 통과해야하지만 NSLOG에 서식 규칙 "%X"를 사용하여 16 진수 값으로 인쇄하고 있음을 알려야합니다.

그런 것이 원하는 것을 인쇄해야합니다.

// First print str1 as an hexadecimal value
// Then print the content of the NSString object str1 points to
NSLog(@"str1: %x, %@", str1, str1);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top