IT이야기

포인터 표현식: *ptr++, *+ptr 및 ++*ptr

cyworld 2022. 6. 3. 22:37
반응형

포인터 표현식: *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";

pchar 투 어 포인트 투 어 어 포인트 투 어 어 포인트 포인트 어 포인트 투 어 포인트 어 어 포인트 투 어 어 포인트char 뜻이죠게게무 슨슨?, ,, 치의 p입니다.charp 메모리 내의 에 메모리 나타냅니다.char.

은 또한 됩니다.p의 첫"Hello"을 하기 p 것이 아니라 글자만 입니다.'H', . . . . . . . . . . . . . .p 포인터입니다.char전체 문자열이 아닙니다.「」의 값p입니다.'H'"Hello".

다음으로 루프를 설정합니다.

while (*p++)

조건 '''는 무엇입니까?*p++이세

  1. 의 연산자 postfix의 .++ 인다이렉션*
  2. postfix 증분식 값
  3. 포스트픽스 증분식의 부작용

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++ 다른 에도 있다*, 그럼 이 은 이 값에서 예요.++ptrsyslog.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) . 。++ 부분은 이 됩니다.*ptrsyslog.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.

  1. *ptr++arr[i]를 설정합니다.ptr의 (i+1) arr 에에니니 . . . . . .에 해당합니다.*(ptr++).

  2. *++ptrptr의 (i+1) arr to to로 합니다.arr[i+1] 에에니니 . . . . . .에 해당합니다.*(++ptr).

  3. ++*ptrarr[i]하다; 1점ptr대로있있 있있있다다은 와와다다 it에 해당합니다.++(*ptr).

하나 더 있지만 쓰려면 괄호가 필요합니다.

  1. (*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 증분을 의미하는 경우 다음과 같이 적습니다.++ptrptr++만약 당신이 말한다면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);

ptrptr그 자체는 변하지 않습니다.

포인터 표현식: *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 = &num;
        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 = &num;
        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 = &num;
        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 = &num;//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 = &num;//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

반응형