展开全部
C语言的大多语法都是简单易懂的,这常常会给初学者一种“别人都说C语言难,我看也不过如此”的感觉。但是这种感觉常常会停止在初学者学到指针时,这是一些读者跟我说的。
鉴于很多C语言初学者都觉得指针非常难,
小明定义了一个C语言函数 int f(int * ),为什么 f(&5) 不能正常工作呢?
如果希望传递 5 给函数 f(),在C99中,可以使用下面这种方法:
f( (int[]){5} );
上面这行C语言代码相当于定义了一个数组,并且数组只有一个元素 5,函数 f() 接收到的参数是该数组,只不过这一过程中的数组名没有“显示”。
抛开C99的这个特性,C语言调用 f(&5) 就不能这么写了,而是需要借助变量:
int five = 5;
f(&five);
在C语言中,接受某个值指针的函数是有可能通过该指针修改该值的(即使程序员无此打算,C语言还是会一直这么认为),因此只有变量才能胜任。在C语言中,常数是只读的,只能作为右值,& 运算符是不能处理常数 5 的,f(&five) 会引发编译错误。
f(&five) 会引发编译错误
表达式 * p++ 增加了 p 指向的数值,还是指针 p 本身?
C语言中的 ++ 和 — 运算符的优先级高于 * 运算符,所以 *p++ 其实就相当于 *(p++)。显然,++ 运算符增加的是指针 p 本身的值,不过在指针 p 自增之前,*p++会先返回 p 指向的值。如果希望 ++ 运算符增加 p 指向的值,应该使用括号运算符:(*p)++。
小明想使用指针操作数组里的数值,下面这段C语言代码有什么问题?
小明预计程序会输出 3,但是程序却输出了“垃圾值”,他的C语言代码如下,请看:
int array[5], i, *ip;
for(i = 0; i < 5; i++)
array[i] = i;
ip = array;
printf("%d\n", *(ip + 3 * sizeof(int)));
鉴于很多C语言初学者都觉得指针非常难,
小明定义了一个C语言函数 int f(int * ),为什么 f(&5) 不能正常工作呢?
如果希望传递 5 给函数 f(),在C99中,可以使用下面这种方法:
f( (int[]){5} );
上面这行C语言代码相当于定义了一个数组,并且数组只有一个元素 5,函数 f() 接收到的参数是该数组,只不过这一过程中的数组名没有“显示”。
抛开C99的这个特性,C语言调用 f(&5) 就不能这么写了,而是需要借助变量:
int five = 5;
f(&five);
在C语言中,接受某个值指针的函数是有可能通过该指针修改该值的(即使程序员无此打算,C语言还是会一直这么认为),因此只有变量才能胜任。在C语言中,常数是只读的,只能作为右值,& 运算符是不能处理常数 5 的,f(&five) 会引发编译错误。
f(&five) 会引发编译错误
表达式 * p++ 增加了 p 指向的数值,还是指针 p 本身?
C语言中的 ++ 和 — 运算符的优先级高于 * 运算符,所以 *p++ 其实就相当于 *(p++)。显然,++ 运算符增加的是指针 p 本身的值,不过在指针 p 自增之前,*p++会先返回 p 指向的值。如果希望 ++ 运算符增加 p 指向的值,应该使用括号运算符:(*p)++。
小明想使用指针操作数组里的数值,下面这段C语言代码有什么问题?
小明预计程序会输出 3,但是程序却输出了“垃圾值”,他的C语言代码如下,请看:
int array[5], i, *ip;
for(i = 0; i < 5; i++)
array[i] = i;
ip = array;
printf("%d\n", *(ip + 3 * sizeof(int)));
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先,你提到的所有p应该是一个类型,也就是
int *p
即,整型指针类型,该类型与一维整型数组等效,即int []
然后一个个来
第一个,只有用在定义的时候才是对的,
int *p=a;意思是定义int*类型的p,初始化为a。等效于int *p;p=a;
第二个,先p+5,然后取值,等效于p[5],在p=a下,也就是a[5],这里其实是越界的,知道是这个意思就好
第三个,先取值,在值加2,p=a时,*p为a[0],这个就是a[0]+2
第四个和第五个类似,如果p=a,那么四五完全等同,都是a[2]的地址
最后一个,对a[5]先取地址再取值,最终还是a[5],这个和第二个是等价的,当然,也一样是越界
int *p
即,整型指针类型,该类型与一维整型数组等效,即int []
然后一个个来
第一个,只有用在定义的时候才是对的,
int *p=a;意思是定义int*类型的p,初始化为a。等效于int *p;p=a;
第二个,先p+5,然后取值,等效于p[5],在p=a下,也就是a[5],这里其实是越界的,知道是这个意思就好
第三个,先取值,在值加2,p=a时,*p为a[0],这个就是a[0]+2
第四个和第五个类似,如果p=a,那么四五完全等同,都是a[2]的地址
最后一个,对a[5]先取地址再取值,最终还是a[5],这个和第二个是等价的,当然,也一样是越界
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
p 和 *ptr 在任何时刻都是相等的,因为他俩实际表示的都是同一个变量。所以输出只能是两个相同数值,而不会是不同数值。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
未定义行为
标准中没有定义赋值和自增发生的先后顺序
所以任何结果都不能算错,取决于编译器的具体实现
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询