指针表达式:*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);
}
分析上面代码的输出,希望你得到上面代码的输出。从上面的代码中可以清楚地看出,指针名称 ( ptr ) 表示我们正在谈论地址,*ptr表示我们正在谈论关于值/数据。
案例 1:*ptr++、*++ptr、*(ptr++) 和 *(++ptr):
上面提到的所有 4 种语法都是相似的,address gets incremented
但地址如何增加是不同的。
注意:求解任何表达式,先找出表达式中有多少个运算符,然后找出运算符的优先级。我有多个具有相同优先级的运算符,然后检查可能从右(R)到左(L)或从左到右的进化顺序或关联性。
*ptr++:这里有 2 个运算符,即 de-reference(*) 和 ++(increment)。两者都具有相同的优先级,然后检查 R 到 L 的关联性。所以从右到左开始求解,无论运算符先到。
*ptr++:第一个 ++ 在从 R 到 L 求解时出现,因此地址增加但其后增加。
*++ptr:与这里的第一个相同,地址也会增加,但它的预增加。
*(ptr++):这里有 3 个运算符,其中 grouping () 具有最高优先级,所以首先 ptr++ 解决了,即地址增加但发布。
*(++ptr):与上述情况相同,这里的地址也增加但预增加。
案例 2:++*ptr、++(*ptr)、(*ptr)++:
上面提到的所有 4 种语法都是相似的,所有值/数据都会增加,但值如何改变是不同的。
++*ptr:第一个 * 在从 R 到 L 求解时出现,因此值发生了变化,但它的预增量。
++(*ptr):与上述情况相同,值被修改。
(*ptr)++:这里有 3 个运算符,其中 grouping () 具有最高优先级, Inside () *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);
}
在上面的代码中,尝试评论/取消评论并分析输出。
指针作为常量:没有任何方法可以将指针设为常量,我在这里很少提及。
1) const int *p OR int const *p:这里value
是常数,地址不是常数,即 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
' ie 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);
}