指针表达式:* 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)表示我们正在谈论地址,而* ptr表示我们正在谈论abbout 值。 / data。
案例1:* ptr ++,* ++ ptr,*(ptr ++)和*(++ ptr):
上面提到的所有4种语法都是相似的,address gets incremented
但是地址的递增方式不同。
注意:要求解任何表达式,请找出表达式中有多少个运算符,然后找出运算符的优先级。在具有相同优先级的多个运算符中,然后检查从右到左(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个运算符,其中分组()具有最高优先级,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或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);
}
(*ptr)++
括号需要与*ptr++