我一直在写类似的东西
char *x=NULL;
Run Code Online (Sandbox Code Playgroud)
假设是
char *x=2;
Run Code Online (Sandbox Code Playgroud)
会创建一个char指向地址2 的指针.
但是,在GNU C编程教程中,它表示int *my_int_ptr = 2;将整数值存储2到my_int_ptr分配时的任何随机地址.
这似乎意味着我自己char *x=NULL正在将NULL一个cast 的值分配给char内存中的某个随机地址.
而
#include <stdlib.h>
#include <stdio.h>
int main()
{
char *x=NULL;
if (x==NULL)
printf("is NULL\n");
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
事实上,印刷品
一片空白
当我编译并运行它时,我担心我依赖于未定义的行为,或者至少是指定不足的行为,我应该写
char *x;
x=NULL;
Run Code Online (Sandbox Code Playgroud)
代替.
我无法弄清楚这一点:
int main() {
int (*) (int *) = 5;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的赋值用g ++ c ++ 11编译.我知道这int (*) (int *)是一个指向函数的指针,它接受一个(int *)as参数并返回一个int,但是我不明白你怎么能把它等同于5.起初我认为它是一个不断返回5的函数(来自我最近的学习) F#,可能,哈哈),然后我简单地想,函数指针指向内存位置5,但这显然不起作用,并且十六进制值也不行.
认为这可能是因为函数返回一个int,并且分配一个int是好的(不知何故),我也试过这个:
int * (*) (int *) = my_ptr
Run Code Online (Sandbox Code Playgroud)
where my_ptr是类型int *,与第二个函数指针的类型相同,如第一种类型为int的情况.这不编译.分配5或任何int值,而不是my_ptr,也不编译此函数指针.
那么作业是什么意思呢?
更新1
我们已经确认这是一个错误,如最佳答案所示.但是,仍然不知道您分配给函数指针的值实际发生了什么,或者赋值的情况.任何(好的)解释都将非常感谢!有关问题的详细说明,请参阅下面的编辑.
编辑1
我使用的是gcc版本4.8.2(在Ubuntu 4.8.2中)
编辑2
实际上,将它等同于我的编译器.甚至将它等同于std :: string变量,或者返回double的函数名,也可以.
编辑2.1
有趣的是,使它成为一个函数指针,指向任何返回不是指针的数据类型的函数,将让它进行编译,例如
std::string (*) () = 5.6;
Run Code Online (Sandbox Code Playgroud)
但是只要函数指针指向返回某个指针的函数,它就不会编译,例如with
some_data_type ** (*) () = any_value;
Run Code Online (Sandbox Code Playgroud) 我最近决定我必须最终学习C/C++,有一件事我不太了解指针,或者更确切地说,他们的定义.
这些例子怎么样:
int* test;int *test;int * test;int* test,test2;int *test,test2;int * test,test2;现在,根据我的理解,前三个案例都是相同的:测试不是一个int,而是一个指针.
第二组示例有点棘手.在case 4中,test和test2都是指向int的指针,而在case 5中,只有test是指针,而test2是"real"int.案例6怎么样?案例5相同?
我知道Go中的指针允许函数参数的变异,但如果它们只采用引用(使用适当的const或可变限定符),它就不会更简单.现在我们有指针和一些内置类型,如地图和通道隐式传递引用.
我是否遗漏了某些内容或指向Go只是一个不必要的并发症?
以下代码(取自此处):
int* ptr = int();
Run Code Online (Sandbox Code Playgroud)
在Visual C++中编译并对指针进行值初始化.
怎么可能?我的意思是int()产生一个类型的对象,int我不能指定int一个指针.
上面的代码如何不违法?
我很难看到函数指针的实用程序.我想它在某些情况下可能是有用的(毕竟它们存在),但我想不出使用函数指针更好或不可避免的情况.
你能举出一些好用函数指针的例子(在C或C++中)吗?
为什么需要std::reference_wrapper?应该在哪里使用?它与简单的指针有什么不同?它的性能与简单的指针相比如何?
我不太了解C#引用和指针之间的区别.他们都指向记忆中的一个地方不是吗?我能弄清楚的唯一区别是指针不是那么聪明,不能指向堆上的任何东西,免于垃圾收集,并且只能引用结构或基类型.
我问的一个原因是,有一种观点认为人们需要很好地理解指针(从C,我猜)是一个优秀的程序员.许多学习更高级语言的人都错过了这个,因此有这个弱点.
我只是不知道指针的复杂程度如何?它基本上只是对内存中某个地方的引用不是吗?它可以返回它的位置并直接与该位置的对象进行交互?
我错过了一个重点吗?
int *nums = {5, 2, 1, 4};
printf("%d\n", nums[0]);
Run Code Online (Sandbox Code Playgroud)
导致段错误,而
int nums[] = {5, 2, 1, 4};
printf("%d\n", nums[0]);
Run Code Online (Sandbox Code Playgroud)
没有.现在:
int *nums = {5, 2, 1, 4};
printf("%d\n", nums);
Run Code Online (Sandbox Code Playgroud)
打印5.
基于此,我猜想数组初始化符号{}会盲目地将这些数据加载到左边的任何变量中.当它是int []时,数组将根据需要填充.当它是int*时,指针被填满5,并且存储指针之后的存储器位置被填充为2,1和4.因此nums [0]尝试deref 5,导致段错误.
如果我错了,请纠正我.如果我是正确的,请详细说明,因为我不明白为什么数组初始化程序按照它们的方式工作.
在boost/mpl/assert.hpp中,我看到这样的事情:
template<class Pred>
struct eval_assert {
typedef typename extract_assert_pred<Pred>::type P;
typedef typename P::type p_type;
typedef typename ::boost::mpl::if_c<p_type::value,
AUX778076_ASSERT_ARG(assert<false>),
failed ************ P::************
>::type type;
};
Run Code Online (Sandbox Code Playgroud)
如果第一个************可以被视为struct失败的指针,那P::************对我来说真的没有任何意义.这是标准的C++吗?