指针表达式:*ptr++、*++ptr 和 ++*ptr:
注意:指针必须初始化并且必须有有效的地址。因为在 RAM 中,除了我们的程序(a.out)之外,还有更多程序同时运行,即如果您尝试访问一些未为您保留的内存,操作系统将通过分段错误。
在解释这个之前,让我们考虑一个简单的例子?
#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) 意味着我们正在谈论 address 而 *ptr 意味着我们正在谈论 abbout 价值/数据。
案例 1:*ptr++、*++ptr、*(ptr++) 和 *(++ptr):
上面提到的所有 4 种语法都是相似的,在所有 address gets incremented 中,但是地址如何增加是不同的。
注意:求解任何表达式,求表达式中有多少个运算符,然后求出运算符的优先级。我有多个具有相同优先级的运算符,然后检查可能从右(R)到左(L)或从左到右的进化顺序或关联性。
*ptr++ :这里有两个运算符,即取消引用(*)和++(增量)。两者都具有相同的优先级,然后检查 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 即值递增但是发帖。
注意 : ++*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);
}
在上面的代码中,尝试注释/取消注释 cmets 并分析输出。
Pointers as Constant : 没有任何方法可以将指针设为常量,我在此仅提及。
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',即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++ 那么你可能认为这是简单的情况,因为我们没有改变地址或值,但它会产生错误。为什么 ?我在 cmets 中提到的原因。
#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);
}