문제

나는 iTunes U의 Stanford의 iPhone 코스에서 내 손을 시도하고 있으며 포인터에 대해 약간 혼란스러워합니다. 첫 번째 과제에서 나는 이런 일을 시도했다

NSString *processName = [[NSProcessInfo processInfo] processName];
NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];

맹목적으로 주위를 끄는 후 오류가 발생했을 때, 나는 그것이 문제를 일으키는 Nsinteger 라인에서 *라는 것을 발견했습니다.

그래서 나는 분명히 무슨 일이 일어나고 있는지 이해하지 못합니다. 나는 그것이 어떻게 작동한다고 생각하는지 설명하고 아마도 누군가가 결함을 지적하기에 충분히 친절 할 것입니다.

웹 개발과 달리 웹 개발보다 메모리에 대해 걱정해야합니다. 따라서 변수를 만들 때 어딘가에 약간의 메모리가 할당됩니다 (RAM이 가정합니다). 변수를 주위에 전달하는 대신, 나는 그 기억에 대한 포인터를 전달합니다. 그리고 포인터는 변수 이름을 *로 접두사하여 선언합니다.

내가 옳다고 가정하면, 내가 어떤 퍼즐이 내가 Nsinteger를 위해 그렇게 할 필요가 없는가?

도움이 되었습니까?

해결책

NSInteger 원시 유형입니다 스택에 로컬로 저장할 수 있습니다. 액세스하기 위해 포인터를 사용할 필요는 없지만 원하는 경우 할 수 있습니다. 라인 :

NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];

주소가 아닌 실제 변수를 반환합니다. 이 문제를 해결하려면 제거해야합니다 *:

NSInteger processID = [[NSProcessInfo processInfo] processIdentifier];

당신은 포인터를 가질 수 있습니다 NSInteger 정말 원한다면 :

NSInteger *pointerToProcessID = &processID;

Ampersand는 연산자의 주소입니다. 포인터를 설정합니다 NSInteger 변수의 정수가 아닌 메모리 변수의 주소와 동일합니다.

다른 팁

당신이 선언하지 않는 이유 NSInteger a * 대상이 아니기 때문입니다. nsinteger는 단순히 an입니다 int 또는 a long:

#if __LP64__
typedef long NSInteger;
#else
typedef int NSInteger;
endif

32 비트 애플리케이션에서 사용중인 경우 32 비트 정수이며 64 비트 응용 프로그램으로 제작 된 경우 64 비트 정수입니다.

물론, 당신 ~할 수 있다 통과합니다 NSInteger 포인터로서, 그러나 대부분의 기능은 단순히 논쟁을 NSInteger 그리고 그것에 대한 포인터가 아닙니다.

반면에 물체는 다른 기능으로 만 포인터로 전달 될 수 있습니다. 객체가 메모리가 동적으로 할당되어 있으므로 스택에서 선언 할 수 없기 때문입니다. an int 또는 long 고정 된 양의 메모리가 할당 된 금액이 있으므로 문제가되지 않습니다.

그만큼 * "포인터"를 의미합니다. 객체 변수는 객체에 대한 포인터를 보유하므로 *; nsinteger 변수는 nsinteger에 대한 포인터가 아닌 nsinteger를 보유하고 있으므로 *. put * 해당 변수에서 정수를 포인터 변수에 넣기 때문에 최소한 경고를 제공합니다.

NSINTEGER는 int, afaik의 타이핑 일뿐입니다.

포인터로 작업합니다

NSInteger integer1 = 1;
NSLog(@"1. integer1:%ld &integer1:%p", integer1, &integer1);
//1. integer1:1 &integer1:0x7ffee59e8a98

NSInteger *integer2 = &integer1;
NSLog(@"2. integer2:%p &integer2:%p *integer2:%ld", integer2, &integer2, *integer2);
//2. integer2:0x7ffee59e8a98 &integer2:0x7ffee59e8a90 *integer2:1

*integer2 = 2;
NSLog(@"3. integer2:%p &integer2:%p *integer2:%ld \t integer1:%ld &integer1:%p", integer2, &integer2, *integer2, integer1, &integer1);
//3. integer2:0x7ffee59e8a98 &integer2:0x7ffee59e8a90 *integer2:2    integer1:2 &integer1:0x7ffee59e8a98
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top