ポインター式:* ptr ++、* ++ ptrおよび++ * ptr:
注:ポインターは初期化する必要があり、有効なアドレスが必要です。私たちのプログラム(a.out)とは別にRAMにあるので、同時により多くのプログラムが実行されています。
これを説明する前に、簡単な例を考えてみましょう。
#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);
}
上記のコードの出力を分析して、上記のコードの出力が得られることを願っています。上記のコードから明らかなことの1つは、ポインター名(ptr)はアドレスについて話していることを意味し、* ptrは値について話していることを意味します / dataます。
ケース1:* ptr ++、* ++ ptr、*(ptr ++)および*(++ ptr):
上記の4つの構文はすべて似ていますが、address gets incremented
アドレスがインクリメントされる方法が異なります。
注:式を解くには、式に演算子がいくつあるかを調べ、次に演算子の優先順位を調べます。同じ優先度を持つ複数の演算子を使用して、右(R)から左(L)または左から右に可能性のある進化または結合性の順序を確認します。
* ptr ++:ここには2つの演算子、つまりde-reference(*)と++(increment)があります。両方が同じ優先度を持っている場合は、RからLまでの関連性を確認します。したがって、最初に来る演算子を問わず、右から左に解き始めます。
* ptr ++:最初の++はRからLへの解決中に来たため、アドレスは増加しますが、事後は増加します。
* ++ ptr:最初のアドレスと同じですが、アドレスも増分されますが、その前の増分です。
*(ptr ++):ここには3つの演算子があり、その中にグループ化()が最も優先度が高いため、最初にptr ++が解決されます。つまり、アドレスは増加しますが、ポストされます。
*(++ ptr):上記の場合と同じですが、ここでもアドレスは増分されますが、事前に増分されます。
ケース2:++ * ptr、++(* ptr)、(* ptr)++:
上記の4つの構文はすべて類似しています。すべての値/データがインクリメントされますが、値がどのように変更されるかは異なります。
++ * ptr:最初の*はRからLに解くときに来たので、値は変更されますが、その前の増分です。
++(* ptr):上記の場合と同じで、値が変更されます。
(* ptr)++:ここには3つの演算子があり、その中にグループ化()が最も優先度が高く、Inside()* ptrがあります。したがって、最初に* ptrが解決されます。つまり、値がインクリメントされてポストされます。
注:++ * 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);
}
上記のコードで、コメントのコメント/コメント解除を試み、出力を分析します。
定数としてのポインタ:ポインターを定数として作成する方法はありませんが、ここでは触れません。
1)const int * p OR int const * p:ここでvalue
は定数、アドレスは定数ではありません。いくつかのアドレス?そのアドレスで値は何ですか?いくつかの価値は正しいですか?その値は定数ですが、その値を変更することはできませんが、ポインターがどこを指しているのですか?いくつかのアドレスは正しいですか?他のアドレスを指すこともできます。
これを理解するために、以下のコードを考えてみましょう:
#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)++
括弧を明確にするために必要な括弧*ptr++
)