类指针
- 指针对象为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; }
|
#
int *q;只有地址,没有内存空间。这个地址是随机地址
但只要是变量就有地址,就可以定义一个指针变量存放它: