C ++ - 获取指针但接收int的方法

时间:2012-03-31 06:23:29

标签: c++ pointers

我想知道当一个整数传递给接受指针的函数时,我将如何处理对函数的调用?在我的情况下,hasPlayedInTeam()接受指向Team的指针,但是,收到了一个int。这会导致Q_ASSERT挂起。

另外,我的问题是否也称为空指针?我的教授在讲座中多次使用过这个术语,但我不确定他指的是什么。

//main.cpp
Person p1("Jack", 22, "UCLA");
Q_ASSERT(p1.hasPlayedInTeam(0) == false);


//person.cpp
bool Person::hasPlayedInTeam(Team *pTeam) {
  bool temp = false;
  foreach (Team* team, teamList) {
    if (team->getName() == pTeam->getName() {
      temp = true;
    }
  }
  return temp;
}

6 个答案:

答案 0 :(得分:7)

在你的电话中:

p1.hasPlayedInTeam(0)

整数文字0转换为NULL指针。所以,你实际上并没有“接收”一个整数;你传递一个整数,编译器可以自动将它转换为空指针(给定NULL的定义)。

我认为您可以通过声明其参数不是NULL来修复hasPlayedInTeam的定义,或者在传入NULL时返回默认值:

//person.cpp
bool Person::hasPlayedInTeam(Team *pTeam) {
    assert(pTeam!=NULL); //-- in this case, your program will assert and halt

或:

//person.cpp
bool Person::hasPlayedInTeam(Team *pTeam) {
    if (pTeam == NULL)
         return false; //-- in this case, your program will not assert and continue with a sensible (it actually depends on how you define "sensible") return value

答案 1 :(得分:2)

是的,听起来你的问题是一个空指针。空指针意味着你有一个指针,它实际上并没有指向任何东西:

Team* team = NULL;

碰巧在C ++中NULL是整数0的宏.Stroustrup有some comments,他更喜欢在代码中使用它。

答案 2 :(得分:1)

函数hasPlayedInTeam()查找类型为“Team”的参数,而您传递的类型为“integer”的参数是错误的....

答案 3 :(得分:1)

是的,我认为你指的是那种情况下的空指针。

要在传递int时处理这种情况,您可以overload函数,并在传递int时使其按照您的意愿运行。

答案 4 :(得分:1)

在C ++中有NULL被定义为0(在某些标准头文件中,我认为是cstddef)所以是的,你传递的整数是空指针。 0是唯一(据我所知)整数,它将自动(隐式)转换为所需类型的指针。

在实践中,我认为大多数人更喜欢使用NULL而不是0作为空指针。

我不知道为什么它会挂起但是,取消引用NULL指针(在您的语句pTeam->getName()中)会导致程序崩溃,如果你传递它NULL,而不仅仅是挂起。

答案 5 :(得分:0)

不幸的是,空指针文字是该语言的一个混乱部分。让我试着回顾一下:

  1. 对于任何类型,都有“指向该类型的指针”的概念。例如,您可以使用整数和指向整数的指针(int x; int *y;),双精度和指向双精度(double x; double *y;)的指针,Person和指向Person(Person x,*y;)的指针。如果X是一个类型,那么“指向X的指针”本身就是一种类型,因此您甚至可以找到指向整数(int **x;)的指针或指向指针指针的指针to chars(char ***x;)。

  2. 对于任何指针类型,都有null pointer 。它是一个并不真正指向对象的值,因此尝试取消引用它是一个错误(“解除引用”指针意味着读取或写入指向的对象)。请注意,当您使用空指针尝试访问不存在的指向对象时,C ++语言并不能保证您将收到消息或崩溃,但只是因为您不应该在程序中执行此操作,因为后果是不可预知的。该语言只是假设你不会做这种错误。

  3. 如何在程序中表示空指针?这是棘手的部分。由于无法理解的原因,C ++语言使用了一个奇怪的规则:如果你得到任何值为零的常量整数表达式那么可以(如果需要)被认为是任何类型的空指针。 / p>

  4. 最后一条规则非常奇怪且不合逻辑,例如意味着

    char *x = 0;     // x is a pointer to char with the null pointer value (ok)
    
    char *y = (1-1); // exactly the same (what??)
    
    char *z = !!    !!  !!    !!  !!       !!  
              !!!   !!  !!    !!  !!       !!
              !!!!  !!  !!    !!  !!       !!
              !! !! !!  !!    !!  !!       !!
              !!  !!!!  !!    !!  !!       !!
              !!   !!!  !!    !!  !!       !!
              !!    !!   !!!!!!   !!!!!!!  !!!!!!1; // Same again (!)
    

    对于任何指针类型都是如此。

    为什么标准规定任何表达式而不仅仅是零文字都可以被认为是空指针值?真的不知道。

    显然,Stroustrup也发现了一些有趣的东西,而不是像它应该的那样恶心(最后一个用“C ++编程语言”一书中带有奇数个否定的“NULL”文本的例子)。

    另请注意,标准标头中定义了NULL符号,为任何类型的空指针值提供有效定义。在“C”中,有效的定义可能是(void *)0,但这在C ++中无效,因为无法将void指针隐式转换为其他指针类型,就像在“C”中一样。

    另请注意,您可以在文献中找到术语NUL(仅一个L),但这是代码为0的ASCII字符(用C / C ++表示'\0')并且是逻辑与指针或整数不同的东西。

    不幸的是,在C ++中,字符也是整数,因此例如'\0'是有效的空指针值,('A'-'A')也是如此(它们是评估为零的整数常量表达式)。

    C ++ 11使用std::nullptr_tnullptr增加了这些已经存在疑问的规则的复杂性。我无法解释这些规则,因为我自己并不了解它们(而且我还不能100%确定我想理解它们。)