标签: pointers

为什么cout打印char数组与其他数组不同?

我正在使用C++来理解指针是如何工作的.我有这段代码使用数组,我只是用它来理解等价物如何与指针一起工作.

int main() {    
    int arr[10] = {1,2,3};    
    char arr2[10] = {'c','i','a','o','\0'};
    cout << arr << endl;
    cout << arr2 << endl;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,arr输出整数数组的第一个元素的地址(如预期的那样),但arr2不输出字符数组的第一个元素的地址; 它实际上打印"ciao".

我错过了什么或者我还没有学到这个?

c++ arrays pointers

14
推荐指数
2
解决办法
2万
查看次数

什么是函数指针,我将如何使用它们?

我明白我可以使用指针来实现功能.

有人可以解释为什么会使用它们,以及如何使用它们?简短的示例代码对我很有帮助.

c pointers function-pointers

14
推荐指数
3
解决办法
2万
查看次数

14
推荐指数
2
解决办法
1687
查看次数

为什么不能将`char**'传递给在C中使用`const char**`的函数?

可能重复:
为什么我不能在C中将'char**'转换为'const char*const*'?

我很好奇,为什么我不能传递char **const char **函数?在传递char *const char *函数的情况下,使用双指针执行它似乎不行.我认为添加常量总是可以的(但不能删除常量)但现在看来我错了.

Gcc编译器给我错误的错误:

note: expected ‘const char **’ but argument is of type ‘char **’
Run Code Online (Sandbox Code Playgroud)

这是代码片段:

int f(const char **a) { }

int main() {
    char *a;
    f(&a);
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

c pointers

14
推荐指数
1
解决办法
1753
查看次数

检查指针是否指向数组

我可以检查给定指针是否指向由其边界指定的数组中的对象?

template <typename T>
bool points_within_array(T* p, T* begin, T* end)
{
    return begin <= p && p < end;
}
Run Code Online (Sandbox Code Playgroud)

或者,如果p指向数组范围之外的点,指针比较是否会调用未定义的行为?在那种情况下,我该如何解决这个问题?它是否适用于void指针?还是不可能解决?

c++ arrays comparison pointers

14
推荐指数
4
解决办法
4122
查看次数

一旦T数组衰减成指向T的指针,它是否可以再次成为T数组?

那么让我们说我有一个数组:

int a[3] = { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

现在,如果我要检查'a'的类型,我会得到:

cout<<typeid(a).name(); // prints 'A3_i'
Run Code Online (Sandbox Code Playgroud)

现在如果我取'a'的地址,然后取消引用该地址,类型不会改变(我真的很喜欢,因为在我看来'取地址'和'取消引用'是反向操作):

cout<<typeid(*&a).name(); // also prints 'A3_i'
Run Code Online (Sandbox Code Playgroud)

然而,如果我首先取消引用'a',然后取用它的地址,类型确实会改变(我承认我很难不喜欢,因为当我取消引用数组时我应该得到一个int,当我拿到地址时那个int,我应该得到一个指向int的指针,事实证明我做了):

cout<<typeid(&*a).name(); // prints 'Pi'
Run Code Online (Sandbox Code Playgroud)

所以这是我的两个问题:

1)一旦数组类型已经衰减成指针类型,无论如何都要将它恢复为数组类型?

我尝试了一种明显的铸造策略 - 就像你不关心一样:

cout<<typeid( (int[3]) &*a).name(); // does not compile
// "error: ISO C++ forbids casting to an array type `int [3]'"
Run Code Online (Sandbox Code Playgroud)

还有另一个演员可以奏效吗?或者这种类型的转换严格禁止?

2)你是否能够回到数组类型,究竟是什么信息在衰变到指针过程中被切片和丢失?

我知道指针类型和数组类型不等价.我假设array-type是存储在指针类型中的信息的严格超集.这听起来不错吗?

我在其他问题中已经读过,数组类型中的额外信息是:知道数组是否在堆栈上,以及它的大小(它必须以某种方式知道数组的大小,因为它是类型,对吗?).数组类型中是否隐藏了其他任何信息?

c++ arrays pointers

14
推荐指数
1
解决办法
702
查看次数

如果"Assigned()"无法做到,如何检测"悬空指针"?

在另一个问题中,我发现Assigned()函数是相同的Pointer <> nil.一直是我的理解Assigned()是检测到这些悬空指针,但现在我已经知道它没有.悬空指针可能是在某一点上创建的,但此后已被释放且尚未分配nil.

如果Assigned()无法检测到悬空指针,那又可以呢?在尝试使用它之前,我想检查我的对象以确保它确实是一个有效的创建对象.我没有使用FreeAndNil尽可能多的推荐,因为我喜欢直接.我只是用SomeObject.Free.

访问违规是我最大的敌人 - 我尽我所能阻止他们出现.

delphi validation pointers delphi-7

14
推荐指数
5
解决办法
3728
查看次数

int*p =(int*)60是什么意思?

#include <stdio.h>

int main()
{
    int *p = (int*) 60;    --- Line 1
    int *q = (int*) 40;    --- Line 2
    printf("%d", p-q);    //Output is 5
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释一下这个程序的输出吗?

c pointers

14
推荐指数
2
解决办法
1万
查看次数

引用Array与对数组指针的引用

void check(void* elemAddr){
    char* word = *((char**)elemAddr);
    printf("word is %s\n",word);
}

int main(){
    char array[10] = {'j','o','h','n'};
    char * bla = array;
    check(&bla);
    check(&array);
}
Run Code Online (Sandbox Code Playgroud)

输出:

word is john

RUN FINISHED; Segmentation fault; core dumped;
Run Code Online (Sandbox Code Playgroud)

第一个工作,但第二个不工作.我不明白为什么会这样.

c arrays pointers

14
推荐指数
2
解决办法
1523
查看次数

什么是"智能指向成员"的真实示例?

澄清英语中可能的优先歧义:我们正在采取"智能(指向成员的指针)",而不是"(智能指针)成员".

我会将一个指向成员智能指针定义为带有operator ->* (T* lhs, X rhs)重载的类X.

在他的文章"实现操作符 - >*用于智能指针"中,Scott Meyers只是简单地触及指向成员的智能指针,因为当时(1999)特定问题对于成员的原始指针来说已经足够困难了(旁注:后者优雅地解决了)这里有lambdas ).

无论如何,Scott Meyers写了一个脚注:

在撰写本文草稿后不久,我的一位咨询客户向我展示了一个问题,这个问题通过智能指向成员的方式自然而然地解决了.我也很惊讶.

我试图找到一个这样一个成员的自然智能指针的例子.但是我既不能自己想出任何东西,也没有在线搜索发现我在寻找什么.

你知道任何现实世界"成员智能指针"的例子吗?

编辑:我不是在寻找任何->*过载(如某些EDSL所做的那样).针对具有类似内置语义的语义示例->*,我上面的定义明确要求lhs是一个原始指针.

c++ pointers smart-pointers operator-overloading operators

14
推荐指数
1
解决办法
460
查看次数