文章目录
  1. 1. 类指针
  2. 2. 指针不是基础类型
  3. 3. 其他概念
  4. 4.

类指针

  1. 指针对象为NULL,为什么仍然可以调用成员函数

参考文章1_对象指针为NULL,为什么还是可以调用成员函数

参考文章2——值为NULL的对象指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

#include<iostream>
#include<string.h>
using namespace std;
class A
{
public:
static void f1(){ cout<<"f1"<<endl; }
void f2(){ cout<<"f2"<<endl; }
void f3(){ cout<<num<<endl; }
virtual void f4() {cout<<"f4"<<endl; }
public:
int num;
};

int main(int argc,char* argv[])
{
A* pa = NULL;
pa->f1(); //正常
pa->f2(); //正常
pa->f3(); //错误,提示段错误
pa->f4(); //错误,提示段错误
return 0;

}

类的成员函数并不与具体对象绑定,所有的对象共用同一份成员函数体,当程序被编译后,成员函数的地址即已确定,这份共有的成员函数体之所以能够把不同对象的数据区分开来,靠的是隐式传递给成员函数的this指针,成员函数中对成员变量的访问都是转化成”this->数据成员”的方式。因此,从这一角度说,成员函数与普通函数一样,只是多了一个隐式参数,即指向对象的this指针。而类的静态成员函数只能访问静态成员变量,不能访问非静态成员变量,所以静态成员函数不需要指向对象的this指针作为隐式参数。

指针不是基础类型

指针是

其他概念

数组不能直接复制给指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39


#include<stdio.h>
void take(int (* arr)[105])
{
arr[0][1]=34;



}
int main()
{


int columnArray[2999][105]={1,23,4};
printf("columnArray=%d\n",**columnArray);


//int (* ptr)[105]=columnArray;// ok



int **ptr=columnArray;//Wwarning: initialization of ‘int **’ from incompatible pointer type ‘int (*)[105]’ [-Wincompatible-pointer-types]
//ptr[0][1]=11; // Error
printf("ptr[0][0]=%d\nm",ptr[0][0]); ///Segmentation fault (core dumped)



//columnArray[0][1]=34;
//printf("columnArray[0][1]=%d\n",columnArray[0][1]);


take(columnArray);
printf("columnArray[0][1]=%d\n",columnArray[0][1]);

return 0;
}


  1. int *q;只有地址,没有内存空间。这个地址是随机地址

  2. 但只要是变量就有地址,就可以定义一个指针变量存放它:

文章目录
  1. 1. 类指针
  2. 2. 指针不是基础类型
  3. 3. 其他概念
  4. 4.