我是C编程的新手,我遇到了一个问题.
如果复杂的声明,我发现了这一点
int *daytab[13]; // daytab is an array of 13 pointers to int
Run Code Online (Sandbox Code Playgroud)
这意味着daytab是数组的名称,数组的名称指向数组的第一个元素.数组名称与像daytab++etc等指针操作不兼容(如果我错了,请纠正我).
但我发现这段代码是用Dennis Ritchie编写的
main(int argc, char * argv[]) {
while( --argc > 0 )
printf("%s%s",*++argv,(argc>1) > " " : "");
printf("\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
他们怎么操纵argv?它不是数组名称吗?
我试图从std :: function中找到函数的地址.
第一个解决方案是:
size_t getAddress(std::function<void (void)> function) {
typedef void (fnType)(void);
fnType ** fnPointer = function.target<fnType *>();
return (size_t) *fnPointer;
}
Run Code Online (Sandbox Code Playgroud)
但这只适用于带有(void())签名的函数,因为我需要签名为(void(Type&))的函数,我试图做
template<typename T>
size_t getAddress(std::function<void (T &)> function) {
typedef void (fnType)(T &);
fnType ** fnPointer = function.target<fnType *>();
return (size_t) *fnPointer;
}
Run Code Online (Sandbox Code Playgroud)
我得到"错误 - 预期"('用于函数式转换或类型构造"
更新:有没有办法捕获成员类地址?对于我正在使用的班级成员:
template<typename Clazz, typename Return, typename ...Arguments>
size_t getMemberAddress(std::function<Return (Clazz::*)(Arguments...)> & executor) {
typedef Return (Clazz::*fnType)(Arguments...);
fnType ** fnPointer = executor.template target<fnType *>();
if (fnPointer != nullptr) {
return (size_t) * fnPointer; …Run Code Online (Sandbox Code Playgroud) 从SO中的这篇文章来看,很明显C支持负指数.
为什么在程序中支持这种潜在的内存违规?
编译器不应该至少抛出一个负指数警告吗?(我正在使用GCC)
或者这个计算是在运行时完成的?
编辑1: 任何人都可以暗示它的用途吗?
编辑2: 用于3.)使用
[]数组/指针中的循环计数器表示指数的运行时计算.
我正在阅读关于维基百科上的整数溢出,并且在看到的字段中遇到了Pointer Swizzling这个术语.
我用谷歌搜索指针调配,但无法理解它.
任何人都可以解释什么是指针调配?
有什么不同?因为这:
int Value = 50;
int *pValue = &Value;
*pValue = 88;
Run Code Online (Sandbox Code Playgroud)
和ref版本做同样的事情:
int Value = 50;
int &rValue = Value;
rValue = 88;
Run Code Online (Sandbox Code Playgroud)
哪一个更好用?谢谢.
void doSomething()
{
TheObject *ptr = new TheObject;
delete ptr;
ptr = NULL;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
让我借用cplusplus.com中operator delete的字样:
释放由ptr指向的内存块(如果不为null),通过调用operator new释放先前分配给它的存储空间,并使该指针位置无效.
请帮助清除我的困惑:删除后指针本身会发生什么?指针本身确实有一个地址,对吗?所以在删除指向的块之后,指针本身呢?
在返回指针初始化的方法后,我可以说指针本身是自由的吗?指针本身是放在堆栈还是堆上?
我知道这个答案,但这不是一回事 - 那就是传递一个用分配初始化的指针.
我正在与具有以下结构定义的C库连接:
typedef struct myStruct { unsigned char var [50]; } myStruct;
Run Code Online (Sandbox Code Playgroud)
有一个函数可以传递结构的地址 - 通常基于堆栈而不是堆,因此:
myStruct mine;
initMyStruct(&mine);
Run Code Online (Sandbox Code Playgroud)
这会初始化结构的内容 - 调用者不知道内存的内部格式,因此会混淆.
在Swift中,我正在创建一个类,它将封装结构和与其他C函数接口的接口.
class MyClass {
var mine : myStruct
init() {
initMyStruct(&mine)
// Error: Variable 'self.msg' passed by reference before being initialized
}
}
Run Code Online (Sandbox Code Playgroud)
我不能为我的生活弄清楚如何初始化结构,或者如果可以替代使用一个点.
mine = myStruct()
// Fails because you aren't providing the value of the member 'var'
mine = myStruct((CUnsignedChar(), CUnsignedChar(), /*... repeat to 50 */))
// Cannot find an overload for 'init' …Run Code Online (Sandbox Code Playgroud) 在这些评论用户@Deduplicator坚持认为,严格别名规则允许通过一个不兼容的类型的访问,如果任一混叠或混叠指针的是一个指针到字符的类型(合格或不合格,符号或无符号char *).所以,他的断言基本上都是这两个
long long foo;
char *p = (char *)&foo;
*p; // just in order to dereference 'p'
Run Code Online (Sandbox Code Playgroud)
和
char foo[sizeof(long long)];
long long *p = (long long *)&foo[0];
*p; // just in order to dereference 'p'
Run Code Online (Sandbox Code Playgroud)
符合并定义了行为.
但是,在我的阅读中,它只是第一种有效的形式,也就是说,当别名指针是指向char的指针时; 但是,在另一个方向上不能这样做,即当别名指针指向不兼容的类型(字符类型除外)时,别名指针为a char *.
所以,上面的第二个片段会有未定义的行为.
情况怎样?它是否正确?为了记录,我已经阅读了这个问题和答案,并且接受的答案明确指出了这一点
规则允许例外
char *.它总是假设char *其他类型别名.但是这不会起作用,没有假设你的结构别名为chars的缓冲区.
(强调我的)
有很多替代方法来处理向量的元素.
我可以像这样使用指针:
vector<int> v = {10, 11, 12};
int *p = &v[0];
cout << *p; //Outputs "10"
Run Code Online (Sandbox Code Playgroud)
我也可以这样使用指针:
vector<int> v = {10, 11, 12};
vector<int>::pointer p = v.data();
cout << *p; //Outputs "10"
Run Code Online (Sandbox Code Playgroud)
我也可以使用迭代器类型:
vector<int> v = {10, 11, 12};
vector<int>::iterator i = v.begin();
cout << *i; //Outputs "10"
Run Code Online (Sandbox Code Playgroud)
我在这里缺少哪些重大差异?
我听说指针首先应该转换为void以确保不同平台上的值的一致性,并且应该使用%p格式说明符.它为什么以及究竟是什么问题?
int x=100;
int *pi=&x;
printf("value of pi is: %p",(void*)pi);
Run Code Online (Sandbox Code Playgroud)