포인터 표현식: *ptr++, *+ptr 및 ++*ptr
최근에 나 혼자서는 이해할 수 없는 이 문제를 만났다.
이 세 가지 표현은 실제로 무엇을 의미합니까?
*ptr++
*++ptr
++*ptr
Ritchie를 시도해 봤어요.그러나 유감스럽게도 이 세 가지 작업에 대해 그가 말한 것을 따를 수 없었습니다.
포인터/지정된 값을 증가시키기 위해 모두 수행된다는 것을 알고 있습니다.또한 평가의 우선순위와 순서에 대해서도 많은 것이 있을 수 있다고 추측할 수 있습니다.먼저 포인터를 증가시킨 후 해당 포인터의 내용을 가져오듯이 단순히 내용을 가져온 다음 포인터를 증가시키는 등입니다.보시다시피, 저는 그들의 실제 작업에 대해 잘 알지 못하기 때문에, 가능한 한 빨리 확인하고 싶습니다.하지만 프로그램에 적용할 기회가 생기면 정말 당황해요.예를 들어 다음과 같습니다.
int main()
{
char *p = "Hello";
while(*p++)
printf("%c",*p);
return 0;
}
는 다음과 같은 출력을 제공합니다.
ello
나는 이 인쇄될 했다.Hello
마지막 요청입니다. 주어진 코드 스니펫에서 각 표현이 어떻게 작동하는지 예를 들어 주십시오.대부분의 경우 이론의 한 단락만 내 머릿속을 스쳐 지나간다.
여기 제가 도움이 되었으면 하는 자세한 설명이 있습니다.가장 간단하게 설명할 수 있는 프로그램부터 시작합시다.
int main()
{
char *p = "Hello";
while(*p++)
printf("%c",*p);
return 0;
}
첫 번째 스테이트먼트:
char* p = "Hello";
p
의 char
투 어 포인트 투 어 어 포인트 투 어 어 포인트 포인트 어 포인트 투 어 포인트 어 어 포인트 투 어 어 포인트char
뜻이죠게게무 슨슨?, ,, 치의 p
입니다.char
p
메모리 내의 에 메모리 나타냅니다.char
.
은 또한 됩니다.p
의 첫"Hello"
을 하기 p
것이 아니라 글자만 입니다.'H'
, . . . . . . . . . . . . . .p
포인터입니다.char
전체 문자열이 아닙니다.「」의 값p
입니다.'H'
"Hello"
.
다음으로 루프를 설정합니다.
while (*p++)
조건 '''는 무엇입니까?*p++
이세
- 의 연산자 postfix의 .
++
인다이렉션*
- postfix 증분식 값
- 포스트픽스 증분식의 부작용
1. 우선순위오퍼레이터의 우선 순위 테이블을 빠르게 보면 포스트픽스 증분이 참조 해제/간접(15)보다 우선 순위(16)가 높다는 것을 알 수 있습니다.이것은 복잡한 표현이*p++
예요.*(p++)
,, ,, ,, ,, ,, ,, ,.*
부분은 이 됩니다.p++
그럼 이 부분, 이 부분, 이 부분, 이 부분, 이 부분.p++
저저헤헤헤헤
2. postfix 표현값.가치p++
is is is is is is is is 。p
인크리먼트가 되기 전에.다음과 같은 경우:
int i = 7;
printf ("%d\n", i++);
printf ("%d\n", i);
출력은 다음과 같습니다.
7
8
i++
i
이치노로, 하 similarly similarlyp++
하겠습니다.p
은 시시시 of of of of of of of . of . of . . of . 。p
입니다.'H'
.
, 그럼 이제...p++
의 *p++
그것은 현재 가치입니다.p
그 다음에*
부품은 발생합니다. *(current value of p)
단 by 、 the means 。p
은 「」라고 하는 것을 알고 'H'
이 *p++
'H'
.
★★★★★★★★★★★★★★▼ if*p++
'H'
왜 안 돼요?'H'
위 코드로 인쇄하시겠습니까?거기서 부작용이 발생해요.
3. 포스트픽스 표현 부작용포스트픽스++
현재 피연산자의 값이 있지만 피연산자가 증가하는 부작용이 있습니다. 네?저것 좀 봐int
시시시:
int i = 7;
printf ("%d\n", i++);
printf ("%d\n", i);
앞에서 설명한 바와 같이 출력은 다음과 같습니다.
7
8
i++
입니다.printf()
7로 합니다., C 은 두 C 규격 의 어느 을 합니다.printf()
실행이 개시되면, 그 부작용은++
연산자가 발생하게 됩니다. 두 에는 두 번째의 앞에는printf()
i
하게 될 입니다.++
번째 printf()
그나저나, 이것은 부작용의 시기에 대해 기준이 보장하는 몇 안 되는 보증 중 하나이다.
「 」는 「 」*p++
, 평가, 평가, 평가: " " " " " " 。'H'
다음 중 하나:
printf ("%c", *p)
그 성가신 부작용이 발생했어요 p
'! '를 .'H'
단, '1'보다 뒤에 'H'
에 : " " 。'e'
바꿔 말하면.허세를 부리다
ello
이 되는 : 한 발음을 입니다."Hello"
의 상대가 , 「와 같은 합니다.
while (*p)
printf ("%c", *p++);
그것에 관해서는 그 정도로 한다.나머지는요?다음과 같은 의미를 묻습니다.
*ptr++
*++ptr
++*ptr
두*++ptr
.
가 증가하는 것을 했습니다.p++
에는 특정 우선순위, 값 및 부작용이 있습니다.프리픽스 증분++p
는 postfix의 경우와 같은 부작용이 있습니다.즉, 오퍼랜드가 1씩 증가합니다.단, 우선순위와 값이 다릅니다.
우선하다 연산자 「」, 「」/「」와 .*
이런 표현으로
*++ptr
중요한 것은 우선순위가 아닙니다.두 연산자는 우선순위가 동일합니다.그래서 연상력이 생깁니다.프리픽스 증분 및 간접 연산자는 오른쪽과 왼쪽의 관련성을 가집니다.그 연관성 때문에 피연산자는ptr
는 맨 연산자 장 the the the the the the the the the the the the the the the the the the the the the the the the the the로 됩니다.++
에는, 「 」라고 하는 것이 .*
그러면다,그러면다,다다,다,다,다,다,다,다,다,다,다,다,다,다,다,다,다,다,다,다,다,다.*(++ptr)
럼, 랄, ..., . ...*ptr++
다른 에도 있다*
, 그럼 이 은 이 값에서 예요.++ptr
syslog.syslog.
그럼 그 가치는 얼마일까요?prefix increment expression 값은 증분 후의 오퍼랜드 값입니다.이로 인해 postfix increment 연산자와는 매우 다른 bast가 됩니다.예를 들어 다음과 같습니다.
int i = 7;
printf ("%d\n", ++i);
printf ("%d\n", i);
출력은 다음과 같습니다.
8
8
...우편 수리업자가 본 것과는 다릅니다.마찬가지로 다음과 같은 경우:
char* p = "Hello";
printf ("%c ", *p); // note space in format string
printf ("%c ", *++p); // value of ++p is p after the increment
printf ("%c ", *p++); // value of p++ is p before the increment
printf ("%c ", *p); // value of p has been incremented as a side effect of p++
출력은 다음과 같습니다.
H e e l // good dog
왜 그런지 알겠어요?
이제 세 인 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 네++*ptr
의 연관성은 .두 연산자 모두 우선순위가 동일하고 오른쪽과 왼쪽의 연관성이 있습니다..++(*ptr)
. 。++
부분은 이 됩니다.*ptr
syslog.syslog.
다음과 같은 경우:
char q[] = "Hello";
char* p = q;
printf ("%c", ++*p);
의외로 자기중심적인 결과는 다음과 같습니다.
I
? ,,, 래서...*p
, 파트는 평가하겠습니다.'H'
그 다음에++
때인가', '어느 때인가', '어느 때인가', '어느 때인가', '어느 때인가', '어느 때인가', '어느 때인가', '어느 때인가'에 이 됩니다.'H'
인!에!요?'H'
값 1을 ASCII 값 1을 수 'H'
. 73 72. 73이 .을 것을 a a a represent a represent a represent a represent representchar
하면 '이렇게 하다'가 나옵니다.char
값 73: ASCII 73 73:'I'
.
이것으로 질문하신 세 가지 표현이 해결되었습니다.다음은 질문의 첫 번째 코멘트에 언급된 다른 예입니다.
(*ptr)++
그것도 재밌어요.다음과 같은 경우:
char q[] = "Hello";
char* p = q;
printf ("%c", (*p)++);
printf ("%c\n", *p);
다음과 같은 열정적인 출력을 얻을 수 있습니다.
HI
무슨 일이야?역시 우선순위, 표현값, 부작용의 문제입니다.괄호 때문에*p
부품이 기본 표현으로 처리됩니다.주요 표현은 다른 모든 것보다 우선합니다. 먼저 평가됩니다. ★★★★★★★★★★★★★★★★★.*p
'라고 평가합니다'H'
은 머지 . . 。++
해당 값에 적용됩니다.이 , 이 경우, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ,(*p)++
becomes가 되다'H'++
.
'H'++
'I'
가치대 인크리먼트의 한다. 리멤버, 리멤버, 리멤버.'H'++
현재의 가치로 평가하다 'H'
첫 번째 ★★★★★★★★★★★★★★★★★★★★★★★.printf()
인쇄하려고 합니다.'H'
그러면 그 부작용으로'H'
로 증가할 것이다'I'
두 . . . .printf()
'I'
츠키노
좋아, 하지만 마지막 두 사건에서는 왜 내가 이 두 사건을
char q[] = "Hello";
char* p = q;
왜 난 그냥 이런 걸 가질 수 없을까?
char* p = "Hello";
printf ("%c", ++*p); // attempting to change string literal!
★★★★★★★★★★★★★★★★★★"Hello"
을 사용하다++*p
을.'H'
에서 " " "로 이동합니다.'I'
줄 "Iello"
C에서 문자열 리터럴은 읽기 전용입니다.문자열 리터럴을 변경하면 정의되지 않은 동작이 실행됩니다. "Iello"
영어로도 정의되어 있지 않습니다만, 그것은 우연의 일치입니다.
반대로, 당신은 그것을 가질 수 없다.
char p[] = "Hello";
printf ("%c", *++p); // attempting to modify value of array identifier!
왜왜???? 이에서는 '''는p
는 배열입니다.할 수 있는 이 값은 수 .p
어레이의 이름이 마치 일정한 포인터처럼 기능하기 때문에 사전 또는 사후 증분 또는 감소로 포인트를 지정합니다(실제로는 그렇지 않습니다.을 참조)
요약하자면, 다음과 같은 세 가지 사항을 질문합니다.
*ptr++ // effectively dereferences the pointer, then increments the pointer
*++ptr // effectively increments the pointer, then dereferences the pointer
++*ptr // effectively dereferences the pointer, then increments dereferenced value
그리고 여기 네 번째가 있습니다. 나머지 세 가지만큼 모든 것이 즐겁습니다.
(*ptr)++ // effectively forces a dereference, then increments dereferenced value
와 두 .ptr
는 실제로는 어레이 식별자입니다. 와 네 .ptr
는 문자열 리터럴을 가리킵니다.
바로 그겁니다.이젠 다 크리스탈이었으면 좋겠어.좋은 관객이 되어주셔서 이번 주 내내 여기 있을 거예요
가정하다ptr
.arr
.
*ptr++
arr[i]
를 설정합니다.ptr
의 (i+1)arr
에에니니 . . . . . .에 해당합니다.*(ptr++)
.*++ptr
ptr
의 (i+1)arr
to to로 합니다.arr[i+1]
에에니니 . . . . . .에 해당합니다.*(++ptr)
.++*ptr
arr[i]
하다; 1점ptr
대로있있 있있있다다은 와와다다 it에 해당합니다.++(*ptr)
.
하나 더 있지만 쓰려면 괄호가 필요합니다.
(*ptr)++
arr[i]
에 그 하다; 1은 증가하지 않는다; 포인터 1은 증가하지 않는다.ptr
하다
나머지는 스스로 알 수 있습니다.그것도 @Jaguar가 대답한 것입니다.
*ptr++ : post increment a pointer ptr
*++ptr : Pre Increment a pointer ptr
++*ptr : preincrement the value at ptr location
사전 증분 연산자 및 사후 증분 연산자에 대한 내용은 여기를 참조하십시오.
으로 알 수 있다Hello
int main()
{
const char *p = "Hello";
while(*p)
printf("%c",*p++);//Increment the pointer here
return 0;
}
다른 답변은 맞지만 뭔가 빠진 것 같기 때문에 제 의견을 덧붙이겠습니다.
v = *ptr++
수단
temp = ptr;
ptr = ptr + 1
v = *temp;
반면에.
v = *++ptr
수단
ptr = ptr + 1
v = *ptr
post increment(및 post decrement)의 의미는 다음과 같습니다.
temp = ptr // Temp created here!!!
ptr = ptr + 1 // or - 1 if decrement)
v = *temp // Temp destroyed here!!!
게게왜 요요?그게 하지 않아요.C++')의 ptr
을 사용법를 들면, 「」
for (std::set<int>::iterator it = someSet.begin(); it != someSet.end(); it++)
「」이(가) 있기 에,it
입니다.it++
이 도 모르다temp
가 어떤 를 취한다면 그렇게 할 것입니다.it++
될 것입니다.temp
.
제가 말하고자 하는 것의 요점은 "무슨 뜻인지 쓰세요'입니다.ptr 증분을 의미하는 경우 다음과 같이 적습니다.++ptr
ptr++
만약 당신이 말한다면temp = ptr, ptr += 1, temp
라고 쓰다ptr++
루프 상태가 좋지 않습니다.
while(*p++)
printf("%c",*p);
와 동일하다
while(*p)
{
p++;
printf("%c",*p);
}
틀렸습니다.그것은 다음과 같습니다.
while(*p)
{
printf("%c",*p);
p++;
}
*ptr++
is is is is is와 *(ptr++)
'먹다', '먹다', '먹다'입니다
const char *ptr = "example";
char value;
value = *ptr;
++ptr;
printf("%c", value); // will print 'e'
*++ptr
is is is is is와 *(++ptr)
'먹다', '먹다', '먹다'입니다
const char *ptr = "example";
char value;
++ptr;
value = *ptr;
printf("%c", value); // will print 'x'
++*ptr
is is is is is와 ++(*ptr)
'먹다', '먹다', '먹다'입니다
const char *ptr = "example";
char value;
value = *ptr;
++value;
printf("%c", value); // will print 'f' ('e' + 1)
const char *p = "Hello";
*p means "Hello"
^
|
p
*p++ means "Hello"
^
|
p
*++p means "Hello"
^
| (WHILE THE STATEMENT IS EXECUTED)
p
*++p means "Hello"
^
| (AFTER THE STATEMENT IS EXECUTED)
p
++*p
는, ASCII 의 ASCII 있는 을 의미합니다.*p
것 같아요.
is "Hello"
^
|
p
값이 상수이기 때문에 값을 늘릴 수 없습니다. 그러면 오류가 발생합니다.
는, 「while loop while loop」, 「while loop」, 「while loop」, 「while loop」까지 가 진행됩니다.*p++
있는 합니다.'\0'
(특수) ★★
★★★★★★★★★★★★★★★★부터*p++
는 첫 번째 문자를 건너뜁니다.두 번째 문자부터 출력됩니다.
코드는 에 ada가 있는 동안 아무것도 . 왜냐하면 루프가'\0'
const char *p = "Hello";
while('\0')
printf("%c",*p);
다음 코드는 다음 코드(예: ello)와 동일한 출력을 제공합니다.
const char *p = "Hello";
while(*++p)
printf("%c",*p);
...................................
const char *p = "Hello";
while(*p++)
printf("%c",*p);
postfix와 prefix는 참조 해제보다 우선도가 높기 때문에
* ptr++ 여기에서는 ptr을 올린 후 ptr의 새로운 값을 가리킵니다.
*++ptr 여기 pre increment fist 다음 ptr의 새로운 값을 가리킵니다.
++*ptr은 먼저 해당 vlaue를 가리키고 증가시키는 ptr의 값을 가져옵니다.
순위는 , 해 주세요.*
는 프리픽스 증가보다 우선하지만 포스트픽스 증가보다는 우선하지 않습니다.이러한 내역은 다음과 같습니다.
*ptr++
에서 오른쪽으로 가서 한 후 값을 가 참조 값이 - 포인터 값을 증가시킵니다.
*++ptr
- 와 참조 해제의 때문에 에서 왼쪽으로 이것은 프리픽스와 참조 해제의 우선순위가 같기 때문에 오른쪽에서 왼쪽으로 순서대로 평가되기 때문입니다.
++*ptr
으로 다시 것을 증가시킵니다 precedence는 포인터가 가리키는 것을 시킵니다. 변수읽기 전용 변수)를되지 않은 합니다.char* p = "Hello";
를 참조해 주세요.
*ptr++ // 1
이것은 다음과 같습니다.
tmp = *ptr;
ptr++;
이 것은ptr
후 됩니다.ptr
가합니니다다
*++ptr // 2
이것은 다음과 같습니다.
++ptr;
tmp = *ptr;
포인터가ptr
이 오브젝트가 포인트 됩니다.ptr
읽혀지고 있습니다.
++*ptr // 3
이것은 다음과 같습니다.
++(*ptr);
이 ptr
ptr
그 자체는 변하지 않습니다.
포인터 표현식: *ptr++, *+ptr 및 ++*ptr:
참고: 포인터를 초기화해야 하며 유효한 주소가 있어야 합니다.RAM에서는 프로그램(a.out)과는 별도로 더 많은 프로그램이 동시에 실행되고 있습니다.즉, OS용으로 예약되지 않은 메모리에 액세스하려고 하면 Segmentation fault를 통해 실행됩니다.
이것을 설명하기 전에 간단한 예를 생각해 봅시다.
#include<stdio.h>
int main()
{
int num = 300;
int *ptr;//uninitialized pointer.. must be initialized
ptr = #
printf(" num = %d ptr = %p and data on ptr : %d \n",num,ptr,*ptr);
*ptr = *ptr + 1;//*ptr means value/data on the address.. so here value gets incremented
printf(" num = %d ptr = %p and data on ptr : %d \n",num,ptr,*ptr);
/** observe here that "num" got changed but manually we didn't change, it got modified by pointer **/
ptr = ptr + 1;//ptr means address.. so here address got incremented
/** char pointer gets incremented by 1 bytes
Integer pointer gets incremented by 4 bytes
**/
printf(" num = %d ptr = %p and data on ptr : %d \n",num,ptr,*ptr);
}
위 코드의 출력을 분석하십시오. 위 코드의 출력을 얻었기를 바랍니다.위의 코드에서 알 수 있는 것은 포인터 이름(ptr)은 주소에 대해, *ptr은 값/데이터에 대해 말하고 있음을 의미합니다.
케이스 1 : * ptr++ , * + ptr , * ( ptr + + )및 * ( + ptr ) :
, 구문은 비슷합니다.address gets incremented
을 하다
참고: 식을 풀려면 식에 연산자가 몇 명 있는지 알아보고 연산자의 우선순위를 알아봅니다.같은 우선순위를 가진 복수의 연산자는 오른쪽(R)에서 왼쪽(L)으로, 왼쪽에서 오른쪽으로의 진화 순서 또는 연관성을 체크한다.
* ptr++ : 2개의 연산자, 즉 de-reference(*)와 ++(증분)가 있습니다.양쪽의 priority가 같기 때문에 R to L의 어소시에이티비티를 확인합니다.따라서 연산자가 먼저 오더라도 오른쪽에서 왼쪽으로 문제를 풀기 시작합니다.
* ptr++ : R에서 L로 풀 때 첫 번째 ++가 왔기 때문에 주소는 증가하지만 포스트는 증가합니다.
*+ptr : 여기의 첫 번째 주소와 마찬가지로 주소도 증가합니다만, 주소의 프리 인크리먼트입니다.
*(ptr++) : 여기에는 3개의 연산자가 있으며, 그 중 priority가 가장 높은 그룹()이 있습니다.따라서 우선 ptr++ 해결된 주소는 증가하지만 post 됩니다.
*(+ptr) : 위의 경우와 마찬가지로 주소도 증가하지만 사전에 증가합니다.
케이스 2: ++*ptr, ++(*ptr), (*ptr)+:
위에서 언급한 4가지 구문은 모두 유사하며 모든 값/데이터가 증가하지만 값이 어떻게 변경되는지는 다릅니다.
++*ptr : R에서 L로 풀 때 첫 번째 *가 왔기 때문에 값은 변경되지만 값은 사전 증분됩니다.
++(*ptr) : 위와 같이 값이 변경됩니다.
(*ptr)++ : 여기에는 3개의 연산자가 있으며, 그 중 우선순위가 가장 높은 그룹()이 있으며, 내부() *ptr이 있습니다. 따라서 먼저 *ptr이 해결됩니다. 즉, 값은 증가하지만 post가 됩니다.
참고: ++*ptr 및 *ptr = *ptr + 1은 모두 동일하며, 두 경우 모두 값이 변경됩니다.++*ptr : 1개의 명령(INC)만 사용되며 싱글샷에서 직접 값이 변경됩니다.*ptr = *ptr + 1 : 여기서 첫 번째 값이 증가(INC)된 다음 할당(MOV)됩니다.
포인터에서 위의 다른 모든 증분 구문을 이해하려면 간단한 코드를 고려합니다.
#include<stdio.h>
int main()
{
int num = 300;
int *ptr;
ptr = #
printf(" num = %d ptr = %p and data on ptr : %d \n",num,ptr,*ptr);
*ptr++;//address changed(post increment), value remains un-changed
// *++ptr;//address changed(post increment), value remains un-changed
// *(ptr)++;//address changed(post increment), value remains un-changed
// *(++ptr);//address changed(post increment), value remains un-changed
// ++*ptr;//value changed(pre increment), address remains un-changed
// (*ptr)++;//value changed(pre increment), address remains un-changed
// ++(*ptr);//value changed(post increment), address remains un-changed
printf(" num = %d ptr = %p and data on ptr : %d \n",num,ptr,*ptr);
}
위 코드에서 코멘트/코멘트 비코멘트 코멘트를 시도하고 출력을 분석합니다.
[Pointers as Constant] : 포인터를 일정하게 할 수 있는 방법은 없습니다.여기서 언급하고 있는 것은 거의 없습니다.
1) const int *p int const *p : 여기 상수가 있습니다.주소는 일정하지 않습니다.예를 들어 p가 가리키는 곳은 어디입니까?어떤 주소?그 주소의 가치는 무엇입니까?가치가 있는 거죠?이 값은 일정하므로 수정할 수 없지만 포인터가 가리키는 위치는 어디입니까?어떤 주소지 맞지?다른 주소를 가리킬 수도 있습니다.
이를 이해하려면 다음 코드를 고려합니다.
#include<stdio.h>
int main()
{
int num = 300;
const int *ptr;//constant value, address is modifible
ptr = #
printf(" num = %d ptr = %p and data on ptr : %d \n",num,ptr,*ptr);
*ptr++;//
// *++ptr;//possible bcz you are trying to change address which is possible
// *(ptr)++;//possible
// *(++ptr);//possible
// ++*ptr;//not possible bcz you trying to change value which is not allowed
// (*ptr)++;//not possible
// ++(*ptr);//not possible
printf(" num = %d ptr = %p and data on ptr : %d \n",num,ptr,*ptr);
}
위 코드의 출력을 분석합니다.
2) int const *p : 라고 부릅니다.**constant pointe**r
예: "address is constant but value is not constant
여기서 주소를 변경할 수는 없지만 값은 변경할 수 있습니다.
주의: 상수 포인터(위 대소문자)는 자체 분리 중에 초기화해야 합니다.
이를 이해하기 위해 간단한 코드를 확인합니다.
#include<stdio.h>
int main()
{
int x = 300;
int* const p;
p = &x;
printf("x = %d p =%p and *p = %d\n",num,p,*p);
}
위의 코드에서는 ++*p 또는 *p++가 없는 것을 알 수 있습니다.주소나 값을 변경하는 것은 아니지만, 에러가 발생하기 때문에, 이것은 단순한 케이스라고 생각할 수 있습니다.왜? 내가 댓글로 언급하는 이유.
#include<stdio.h>
int main()
{
int x = 300;
/** constant pointer must initialize while decaring itself **/
int* const p;//constant pointer i.e its pointing to some address(here its pointing to garbage), it should point to same address(i.e garbage ad
dress only
p = &x;// but here what we are doing ? we are changing address. we are making p to point to address of x instead of garbage address.
printf("x = %d p =%p and *p = %d\n",num,p,*p);
}
그렇다면 이 문제의 해결책은 무엇일까요?
int* const p = &x;
이 케이스에 대한 자세한 내용은 아래의 예를 참조해 주십시오.
#include<stdio.h>
int main()
{
int num = 300;
int *const ptr = #//constant value, address is modifible
printf(" num = %d ptr = %p and data on ptr : %d \n",num,ptr,*ptr);
*ptr++;//not possible
// *++ptr;//not possible bcz you are trying to change address which is not possible
// *(ptr)++;//not possible
// *(++ptr);//not possible
// ++*ptr;// possible bcz you trying to change value which is allowed
// (*ptr)++;// possible
// ++(*ptr);// possible
printf(" num = %d ptr = %p and data on ptr : %d \n",num,ptr,*ptr);
}
3) const int* const p : 여기서 주소와 값은 모두 일정합니다.
이를 이해하려면 아래 코드를 확인하십시오.
#include<stdio.h>
int main()
{
int num = 300;
const int* const ptr = #//constant value,constant address
printf(" num = %d ptr = %p and data on ptr : %d \n",num,ptr,*ptr);
*ptr++;//not possible
++*ptr;//not possible
printf(" num = %d ptr = %p and data on ptr : %d \n",num,ptr,*ptr);
}
- ★★★★★
++
보다*
. - 및 ++
*
둘 다 같은 우선순위를 가지며 두 식을 모두 가진 식에는 오른쪽에서 왼쪽으로의 연산자 어소시에이티가 있습니다.즉, 오른쪽 연산자가 왼쪽 연산자보다 먼저 피연산자에 바인드됩니다.
그 때문에,
*ptr++
포인터를 1 항목 늘린 후 증가하기 전에 메모리 위치를 참조 해제합니다.*++ptr
포인터를 1 항목 늘린 후 포인터가 가리키는 메모리 위치를 참조 해제합니다.++*ptr
메모리 위치를 참조 해제한 다음 메모리 위치의 내용(값)을 1씩 증가시킵니다.
언급URL : https://stackoverflow.com/questions/18481740/pointer-expressions-ptr-ptr-and-ptr
'IT이야기' 카테고리의 다른 글
순수 VUE 구성 요소에 스타일 추가 (0) | 2022.06.03 |
---|---|
Android는 간단한 애니메이션을 추가하면서 setvisibility(뷰)를 제공합니다.사라지다) (0) | 2022.06.03 |
axios 응답 개체의 모든 항목에서 vuex 상태로 특정 값을 추출하려면 어떻게 해야 합니까? (0) | 2022.06.03 |
Vue js의 Firebase에서 토큰을 검색하는 동안 오류가 발생하는 이유는 무엇입니까? (0) | 2022.06.03 |
Nuxt SSR 인증 가드 및 Firebase 인증 (0) | 2022.06.03 |