鼎城网站建设,怎么样分析一个网站,app拉新工作室,网站建设营销型文章目录1. 引用和指针的区别#xff1f;2. C中的指针参数传递和引用参数传递1. 引用和指针的区别#xff1f;
指针是一个实体#xff0c;需要分配内存空间。引用只是变量的别名#xff0c;不需要分配内存空间。
#includeiostream
using namespace std;class sol…
文章目录1. 引用和指针的区别2. C中的指针参数传递和引用参数传递1. 引用和指针的区别
指针是一个实体需要分配内存空间。引用只是变量的别名不需要分配内存空间。
#includeiostream
using namespace std;class solution {
public:void print() {cout print endl;}
private:int a;int b;
};
int main() {int* p1 new int;double* p2 new double;solution* p3 new solution;cout 字节数 sizeof(p1) 指针值所在内存地址 p1 endl;cout 字节数 sizeof(p1) 指针值所在内存地址 p2 endl;cout 字节数 sizeof(p1) 指针值所在内存地址 p3 endl;return 0;
}字节数4 指针值所在内存地址008FF9EC
字节数4 指针值所在内存地址008FF9E0
字节数4 指针值所在内存地址008FF9D4从代码可以看出指针都占用4字节的空间 #includeiostream
using namespace std;int main() {double a 3.14;double b a;cout b占用的字节数 sizeof(b) b的地址 b endl;cout a占用的字节数 sizeof(a) a的地址 a endl;return 0;
}b占用的字节数8 b的地址00E3FC1C
a占用的字节数8 a的地址00E3FC1C从代码可以看出a和b的大小相同并且所在地址相同所以a就是bb就是a引用b是a的别名。 引用在定义的时候必须进行初始化并且不能够改变。指针在定义的时候不一定要初始化并且指向的空间可变。注不能有引用的值不能为NULL
#includeiostream
using namespace std;int main() {int a 1;int b 5;int* p;//正确指针可以不进行初始化p a;cout *p *p a a endl;p b;//正确指针的指向可以发生改变cout *p *p a a endl;return 0;
}*p1 a1
*p5 a1上面代码说明指针可以不进行初始化并且指针指向的变量可以发生改变。 #includeiostream
using namespace std;int main() {int a 1;int b 5;int r;//错误引用必须进行初始化return 0;
}运行错误引用必须进行初始化 #includeiostream
using namespace std;int main() {int a 1;int b 5;int ref a;ref 3;cout a a ref ref endl;ref b;cout a a ref ref endl;ref 108;cout a a ref ref endl;return 0;
}a3 ref3
a5 ref5
a108 ref108以上代码说明ref成为a的引用后也即别名后ref就和a绑定在一起ref发生什么变化a就发生什么变化即ref和a的绑定关系不发生改变。 有多级指针但是没有多级引用只能有一级引用。
#includeiostream
using namespace std;int main() {int** p;//正确二级指针int r;//错误没有多级引用return 0;
}指针和引用的自增运算结果不一样。指针是指向下一个空间引用时引用的变量值加1
#includeiostream
using namespace std;int main() {double a 3.14;double* p a;cout p指向的地址 p endl;p;cout p自增指向的地址 p endl;int b8;int r b;cout r r endl;r;cout r r endl;return 0;
}p指向的地址00EFFC58
p自增指向的地址00EFFC60
r8
r9以上代码可以看出p会使得p指向地址变为下一个地址空间因为p指向的变量类型为double型所以地址值加8个字节引用自增会加1。 sizeof 引用得到的是所指向的变量对象的大小而sizeof 指针得到的是指针本身的大小。 引用访问一个变量是直接访问而指针访问一个变量是间接访问。 使用指针前最好做类型检查防止野指针的出现 引用底层是通过指针实现的 作为参数时也不同传指针的实质是传值传递的值是指针的地址传引用的实质是传地址传递的是变量的地址。
2. C中的指针参数传递和引用参数传递 指针参数传递本质上是值传递它所传递的是一个地址值。值传递过程中被调函数的形式参数作为被调函数的局部变量处理会在栈中开辟内存空间以存放由主调函数传递进来的实参值从而形成了实参的一个副本替身。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行的不会影响主调函数的实参变量的值形参指针变了实参指针不会变。 引用参数传递过程中被调函数的形式参数也作为局部变量在栈中开辟了内存空间但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参本体的任何操作都被处理成间接寻址即通过栈中存放的地址访问主调函数中的实参变量根据别名找到主调函数中的本体。因此被调函数对形参的任何操作都会影响主调函数中的实参变量。
#includeiostream
using namespace std;void p_fun(int* p) {int a 108;p a;
}void r_fun(int r) {r 100;
}
int main() {int value1 10;int* p value1;cout p指向的地址 p endl;p_fun(p);cout p指向的地址 p endl;int value2 11;int r value2;cout value2 value2 endl;r_fun(r);cout value2 value2 endl;return 0;
}p指向的地址0075FB7C
p指向的地址0075FB7C
value211
value2100指针作为参数传入函数函数内部改变指针指向的地址值并不影响主调函数内指针值引用作为参数传入函数函数内部改变引用的值那么主调函数中的引用和引用绑定的变量都会发生改变。 引用传递和指针传递是不同的虽然他们都是在被调函数栈空间上的一个局部变量但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。而对于指针传递的参数如果改变被调函数中的指针地址它将应用不到主调函数的相关变量。如果想通过指针参数传递来改变主调函数中的相关变量地址那就得使用指向指针的指针或者指针引用。 从编译的角度来讲程序在编译时分别将指针和引用添加到符号表上符号表中记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值而引用在符号表上对应的地址值为引用对象的地址值与实参名字不同地址相同。符号表生成之后就不会再改因此指针可以改变其指向的对象指针变量中的值可以改而引用对象则不能修改。