为了节省内存,C++把常量字符串单独放在一个内存区域,如果有几个指针指向相同的常量字符串时,它们实际上指向的是相同的内存地址。...而数组是要每一个数组单独占用一块内存的 1 #include "stdafx.h" 2 #include 3 using namespace std; 4 5 int..._tmain(int argc, _TCHAR* argv[]) 6 { 7 char str1[]="hello world"; 8 char str2[]="hello world
C++也算是学了有些年头,可惜还是不甚了解,这不,今天对于指针、引用和常量这三个在C++中处处可见的东西又有些懵里懵懂了,也罢,今天就稍稍学究一下,再尽力整理一番其中的一些“故事”吧,一则帮助自己记忆...常量指针:常量“的”指针,指向常量的指针,所指内容是不能更改的(read-only),但指针本身是可以修改的 示例:const Object* objPtr、const int *iPtr 2...指针常量:指针“的”常量,即本身为常量的指针,所指向内容是可以修改的,但指针本身是不可以修改的 示例:Object* const objPtr、int * const iPtr 3. ...引用本身即带有常量语义(类似int& const 的代码表述会引起编译错误),即你无法改变一个已经赋值的引用本身,类似的赋值操作所改变的仅是引用所引用(指向)的数据,并不改变引用本身,所以引用非常类似指针常量...对于一般数据类型(基本类型和自定义类型)而言,const的位置并不影响其的常量语义,例如const int 和 int const 都表示该int数据为常量,没有区别。 7.
---- 引用(不能作为对象): 起一个另外的名字而已,好比如*文华今天叫小华,明天别人叫他小文,他还是他。 注意上述中的引用应该是指“小文”这个名字符号,而不是指小文其人,故引用不是对象!...指针与引用相比: 指针本身是一个对象,存放某个对象的地址,允许对指针赋值和拷贝,在其生命周期内可先后指向不同的对象; 指针无须定义时一定赋确定的值,可用nullptr,0,NULL(头文件cstdlib...(严格说,引用不是对象,不存在常量引用一说法,人们常常喜欢用它时,不过方便描述罢) 引用与const: 例1 const int a=24; const int &b=a;//此时引用和引用对应的对象都是常量...p1作为指向常量的指针,仅限制其本身不能改变所指对象的值,并不限制所指向对象是否常量 例6 int a=24; int *const p=&a;//p将一直指向a,即p是常量指针!...顶层const和底层const: 指针作为一个对象,可指向另外一个对象,这两个对象是否常量是独立的。 顶层const:指针本身是const。更一般地,当任意一个对象是常量时,可称为顶层const。
数据类型: 常量:常量包括字面常量、直接常量和符号常量; 变量:C语言规定标志符只能由字母、数字和下划线三种字符组成,且第一个字符必须是字母或者下划线;必须压迫先定义后使用;每一个变量被定义以确定类型后...,在编译时就能为其分配相应的存储单元; 整数类型:整数常量有十进制、八进制和十六进制;“%d” 整形变量:数据在内存中存放形式是以二进制形式存放;有int型、short int型和long int...指针的定义及赋值: 类型说明 *变量名 列如 int *p; 区别 int *p=NULL 与 *p=NULL int *p=NULL; //定义指针变量p,并且同时将...int i=10;int *p=&i;*p=NULL; //这时i中的值由10变成了0,而p值本身没变,即内存地址没有改变 指针的大小: int *P;sizeof(p);...int a[10];int *p=&a; //+1,加了sizeof(int)*1个字节,而不是加sizeof(int[10])*1个字节 指针的使用类型 指针形式 数组形式: int
C和指针 相关基础知识:内存的分配(谭浩强版) 1、整型变量的地址与浮点型/字符型变量的地址区别?(整型变量/浮点型变量的区别是什么) 2、int *p,指向整型数据的指针变量。...4、*p :指针变量p指向的存储单元(变量) 5、p = &a——>> *p = *&a 6、用指针作函数参数 7、调用函数中,由于虚实结合是采用单向的“值传递”方式,只能从实参向形参传数据,形参值的改变无法回传给实参...原文链接 13、实参和形参的结合有一下4种形式: 实参 形参 数组名 数组名 数组名 指针变量 指针变量 数组名 指针变量 指针变量 14、实参数组名a代表一个固定的地址,或者说是指针常量,因此其值不可改变...// a++ //语法错误,不可改变 15、字符串与指针。字符串数组/字符串变量/字符指针 存放字符串。...(1)将变量名作为实参和形参。值传递是单向的,实参传给形参,形参改变不影响实参的值。 因为在调用函数时,形参和实参不在同一存储单元。
内联函数 内联函数: 在调用的时候不会进行压栈出栈(不会经历保存地址的过程和恢复地址的过程)。 内联函数相当于一个替换的过程。 内联函数设计要注意:内联函数里只能写简单的代码—不能写复杂代码。...字符串数组和字符串常量定义问题 #include int main() { //p1指向的字符串是在程序编译的时候赋值 char *p1="1234567890"; //指针指向字符串常量...0; } 示例2: #include int main() { //p1指向的字符串是在程序编译的时候赋值 char *p1="1234567890"; //指针指向字符串常量...语法:int (*p)(int,int); 不支持++和—运算符。 指针函数: 本身是函数,表示函数的返回值是指针类型。语法: int *func(int a,int b){} 函数名称就是地址。.../指向函数的指针 p=func; printf("%d\n",func(10,20)); //通过函数名称调用函数 printf("%d\n",p(10,20)); //通过指针调用函数--写法1
引用一个字符串,可以用以下两种方法: 用字符数组存放一个字符串,可以通过数组名和格式声明 “%s” 输出该字符串也可以通过数组名和下标引用字符串中一个字符。...用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。...printf("b = %s\n", b); } image.png 字符指针变量和字符数组的比较 用字符数组和字符指针变量都能实现字符串的存储和运算; 它们二者之间是有区别的,主要有以下几点: 1....例如:a[5]、*(a+5) 如果字符指针变量p=a,则也可以用指针变量带下标的形式和地址法引用。...在被调用的函数中可以改变字符串的内容,在主调函数中可以引用改变后的字符串。 例子 用函数调用实现字符串的复制。
; const int arr [3] = {1,2,3};//与上面等价 限定这些变量作为常量,无法修改 2.2 const修饰指针(*) 2.2.1 常量指针 当为常量指针时,==不可以通过修改所指向的变量的值...int a = 5; const int *p =&a; *p = 20; //error 不可以通过修改所指向的变量的值 int b =20; p = &b; //right 指针可以指向别的变量...int a = 5; int *const p = &a; *p = 20; //right 可以修改所指向变量的值 int b = 10; p = &b; //error 不可以指向别的变量...3.2 const修饰函数返回值 修饰返回值,就是不能修改返回值 对于函数来说,返回值如果是int类型的值,就算用const限定,但是函数调用结束会清楚栈,因此没有必要 如果函数返回值是指针的话,我们加上限定符号...如果函数名、参数、返回值都相同的const成员函数和非const成员函数是可以构成重载,那么const对象调用const成员函数,非const对象默认调用非const的成员函数。
而void类型的指针则可以存放指向任何类型的指针,但它不能引用自身。 运算符优先级: 一元运算符*和&的优先级比算术运算符的优先级要高。...第一个函数alloc(n)返回一个指向n个连续字符存储单元的指针,alloc函数的调用者可利用该指针存储字符序列。第二个函数afree(p)释放已分配的存储空间,以便以后重用。...由于函数alloc和afree处理的对象是指针不是数组下标,因此,调用函数无需知道该数组的名字,这样,可以在包含alloc和afree的源文件中将该数组声明为static类型,使得它对外不可见。...指针与整数之间不能相互的转换,但0是唯一的例外:常量0可以赋值给指针,指针也可以常量0进行比较。程序中常用符号常量NULL代替常量0,这样便于清晰的说明常量0是指针的一个特殊值。...p是指向字符的指针,所以每执行一次p++,p就将指向下一个字符的地址,p-s则表示已经检查过的字符数,即字符串的长度。
但是数组变量和指向它首元素的指针变量又是完全不同的两个概念。那么数组名和指针又有什么区别呢? 类型不同。如上,变量p是指针类型,变量arr是数组类型 性质不同。p是变量,可以修改值,重新指向其他地址。...,指针本身就表示了字符串,而不要对其进行解引用。...使用字符串指针时,要注意指向字面常量和指向字符数组的区别 1 #include 2 3 int main(){ 4 char *str1 = "hello, Alex"...当我们对指针常量使用解引用符修改内容时不受影响。...1 int n = 7; 2 int* const p1 = &n; 3 //可使用解引用符,修改指针常量所指向的内存空间的值 4 *p1 = 1; //相当于n=1 当然
数组的维数必须用值大于等于1的常量表达式定义。此常量表达式只能包含整型字面值常量、枚举常量或者用常量表达式初始化的整型const对象。...6、指针和引用的比较 引用总是指向某个对象,定义引用时没有初始化是错误的;赋值行为的差别,给引用赋值修改的是该引用所管理的对象的值,而并不是使引用与另一个对象关联。...int *p = &ia[2]; //ok:p points to the element indexed by 2 int j = p[1]; //p[1] == ia[3] ,ok:...p[1] equivalent to *(p + 1) , p[1] is the same element as ia[3] int k = p[-2]; //p[-2] == ia[0] ok...标准库函数strlen总是假定其参数字符串以null字符结束,当调用该标准库函数时,系统将会从实参ca指向的内存空间开始一直搜索结束符,知道恰好遇到null位置。
将常量字符串赋值给数组(str1和str2),本质上是将这个常量字符串复制一份到数组中,这两个数组其实并不在一个空间,所以str1=str2,并且复制出来的常量字符串是可以修改的。 ...而如果通过字符指针变量指向常量字符串(str3和str4),对于常量字符串来说,是只能读不能改的,从内存利用率来说,内容相同的字符串只会保存一份,所以str3=str4....add和&add是一样的,因为对于函数来说,函数名是地址,&函数名也是地址 同理*p和p也是一样的,函数指针变量是可以不需要解引用。...都是函数的地址,所以对于pf3来说,即使不解引用也是可以调用函数的,但如果解引用了,一定要记得用括号( )将*和pf3放在一起!!...( )类型的函数指针,再进行解引用,得到的是函数指针的地址,结尾的( )就是调用0地址处的函数。
2)实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值 。 3)实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配的错误。...上述*和&的区别 (1)*p是指指针p指向地址的那个变量,例如int a=5;int p=a;那么p的值是a的地址,也就是指针p指向a,p则等于a的值,即p=5。...p)=== if( p==NULL ) 常量表达式和constexpr与const 常量表达式概念:值不会改变并且在编译过程中就能计算出结果的表达式。...const限定指针和引用。...//指向常量的指针,而非常指针。
常量指针和指针常量: 常量指针是一个指针,读成常量的指针,指向一个只读变量。如int const *p或const int *p。 指针常量是一个常量,指针的值可以改变。如int *const p。...指针相关问题 指针的相关判断 int *p[10] int (*p)[10] int *p(int) int (*p)(int) ``` - int *p[10...- int (*p)[10]表示数组指针,强调是指针,只有一个变量,是指针类型,不过指向的是一个int类型的数组,这个数组大小是10。...- int (*p)(int)是函数指针,强调是指针,该指针指向的函数具有int类型参数,并且返回值是int类型的。 ##### 指针与数组名 - 二者均可通过增减偏移量来访问数组中的元素。...char a[] = “hello”; a[0] = ‘X’; char *p = “world”; // 注意p 指向常量字符串,指向的是常量区 p[0] = ‘X’; // 编译器不能发现该错误,运行时错误
如果其它对象可以获得该属性的非常量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。 ...1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。 ...(1)修改内容上的差别 char a[] = “hello”; a[0] = ‘X’; char *p = “world”; // 注意p 指向常量字符串 p[0] = ‘X’; // 编译器不能发现该错误...答案:正确 这个 sizeof是编译时运算符,编译时就确定了 ,可以看成和机器有关的常量。 题:引用与指针有什么区别? 【参考答案】 引用必须被初始化,指针不必。 ...而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应) 。 (2) 有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。
什么是函数指针,如何定义函数指针,与指针函数有何区别 参考链接:函数指针和指针函数区别 智能指针 参考链接:智能指针的用法 指针常量和常量指针和常量指针常量 define与const关键字的多种用法...-CSDN博客 nullptr调用成员函数可以吗?...用free或delete释放了内存之后,立即将指针设置为NULL,防止“野指针” c++指针和引用的区别 指针可以被重新赋值指向其他变量,而引用一旦绑定到一个变量上就不能再绑定到其他变量上。...endl; return 0; } void *p (无类型指针) 注意在使用 void * 指针时,为了正确解引用指针并获取其指向的值,需要在使用前进行类型转换。...printf("字符变量的值:%c\n", *((char*)p)); return 0; } double free什么情况会造成?
const修饰所涉及到的问题: 对于常量指针:const int *a 指针指向空间的值不能发生改变,不能通过指针解引用修改指针所指空间的值,但是指针的方向可以发生改变 而对于指针常量: int *...const a 指针本身是一个常量,指针的指向不能发生改变,但是指针所指向空间的值是可以发生改变的,可以通过指针解引用改变指针所指空间的值 对于这两个的区分方法: const * 的相对位置: const...在 的左边为常量指针;const在*的右边就表示一个指针常量* p1、p2是常量指针,p3是指针常量,选C 3.下面叙述错误的是() char acX[]="abc"; char acY[]={'a'...都是在栈上开辟的空间,可以修改 szX和szY都是指针,指向同一个字符串,所以使用同一块空间 zcX是字符串初始化是:abc\0,而acY只有abc,所以acX占用的空间比acY大 对于D:szX...):a先和[]结合,表示是一个数组,再和*结合,为指针数组,指针指向的是函数,函数有int类型,并返回int。
用strlen(p),得到的是5,与strlen(str)等价。 上面的是sizeof和strlen的区别,也是指针字符串和数组字符串的区别。...const const一般的用法就是修饰变量、引用、指针,修饰之后它们就变成了常量,需要注意的是const并未区分出编译期常量和运行期常量,并且const只保证了运行时不直接被修改。...此外,const还有下面这种与指针结合的比较绕的用法: int a = 1; const int b = 2; const int* p = &a; int const* p1 = &a; // *p...= 2; // error C3892: “p”: 不能给常量赋值 p = &b; // *p1 = 3; // error C3892: “p1”: 不能给常量赋值 p1 = &b; int* const...p3 = &a; const int 与 int const并无很大区别,都表示: 指向常量的指针,可以修改指针本身,但不能通过指针修改所指向的值。
而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。 2) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。 20.简述数组与指针的区别?...(1) 修改内容上的差别 char a[] = “hello”; a[0] = ‘X’; char *p = “world”; // 注意p 指向常量字符串 p[0] = ‘X’; // 编译器不能发现该错误...sizeof(p),p为指针得到的是一个指针变量的字节数,而不是p 所指的内存容量。C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。...答案:正确 这个 sizeof是编译时运算符,编译时就确定了 ,可以看成和机器有关的常量。 第25题:引用与指针有什么区别?...(1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应) 。
3.指针有类型,指针的类型决定+-整数的步长,以及解引用时的权限。 字符指针: 如图,这是最简单的例子,我们利用指针p指向ch的地址,打印时,解引用p就能打印字符g啦。...如果使p指向常量字符串,打印时只打印了a这是为什么呢?其实,当我们用指针指向常量字符串时,指向的是首字符的地址,即a的地址。如果我们想打印字符串,直接用%s即可。...不过需要注意的是,我们不能通过指针p来改变常量字符串的内容,否则就会出现下面的情况 分析:str1和str2是两个数组,数组的操作方式是将右边常量字符串的内容拷贝进来,所以他们是两个空间,只是内容相同,...而str3和str4是两个指针,编译器在处理的时候,会将相同的常量字符串做成同一个地址,所以,str3和str4指向的是同一个常量字符串,所以str3 == str4。...如果我们想调用,只需解引用然后给上实参即可。
领取专属 10元无门槛券
手把手带您无忧上云