C语⾔C++指针知识点总结详解
C++指针
1、什么是指针
如果把某⼀块已经开辟的内存空间⽐作房间,那么指针就是⼀把钥匙。房间有⼤有⼩,⽽钥匙就那么⼤,所以指针所占⽤的字节为4字节。这把钥匙可以根据你的设定来让它开哪个房间,但是,最多只能开⼀个房间。
2、指针定义和赋值
c语言指针实验总结1、定义
我们平常见到的定义指针有两种写法:int *p和int* p,其实这两种写法效果是⼀样的,但是为了避免混淆,建议采⽤第⼀种int *p,因为如果你同时定义了⼀个指针变量和⼀个普通变量,如:int* p,a;你可能以为定义了两个指针p和a,所以采⽤第⼀种能避免混淆。
2、赋值
赋值⽅式有两种
定义时赋初值:int a; int *p=&a
先定义,后赋初值:int a; int *p; p=&a
注意:哪怕你知道变量a的地址是1100,你也不能将1100直接赋给p,⼀定要⽤取地址的⽅式。
3、数组⾸地址赋给指针
我们都知道,数组名就是数组的⾸地址,所以将指针指向数组时直接把数组名赋给指针变量即可:int a[10]; int *p; p=a;
3、引⽤指针变量
&作为取地址符,*是取值符,如果指针指向的是单个变量,直接⽤ *将p指向地址的值取出即可:cout<<*p<<endl;
如果指针指向的是⼀个数组,那么 *p 取得是第⼀个值,因为前⾯说过将数组⾸地址是赋给p的,但如果要表⽰a[1],a[2],可以⽤ *(p+1), * (p+2)来表⽰,p++代表的是将指针的指向移动⼀个位置, 不是移动⼀个字节,移动的字节数取决于指针指向的类型,如果指针指向的是int类型的数组,那么每次p++就移动4个字节,如果指向char类型的数组,每次p++就移动1个字节。
也可以直接⽤cout<<p[1]<<p[2]<<endl;来直接引⽤数组元素,因为数组名相当于指针,所以指向数组名的指针可以当做数组名来使⽤。
4、指针作函数参数
⼀般调⽤函数传参都是值传递,如果函数参数时指针的话,那么调⽤函数时就得将相应地址传过去,所以函数执⾏过程中进⾏的⼀系列操作也是对地址进⾏的操作,也就改变了实参的值。常见的地址传递有:
(1)传递数组名进⾏排序mySort(arr,len)
(2)排序过程中两个数交换swap(&arr[i],&arr[j])
5、字符串与指针
在C语⾔中,⼀个字符串常量不可以直接赋给⼀个数组,⽐如:char s[10]; s="hello";这种写法是错误的。但是⼀个字符串却可以直接赋给⼀个指针:char *p; p="hello";这仅限于将⼀个字符串常量的地址赋给指针p,但如果char s[10]; char *p=s; *p="hello";这就是⾮法的,这就相当于直接把字符串常量赋给⼀个数组,其实字符串常量赋给⼀个数组可以采⽤strcpy()函数。
6、函数与指针
函数的返回值也可以是指针类型,前提是这个指针指向的内存在函数调⽤后不会被销毁,在这⾥不做过多说明。
7、指向指针的指针
例如:
int a=10;
int*p=&a;//取a的地址传给p
int*(*pp)=&p;//取p的地址传给pp
//如何引⽤:
cout<<a<<endl;
cout<<*p<<endl;
cout<<*(*pp)<<endl;//因为*pp相当于p,所以*(*pp)相当于*p也就是a
8、const指针相关【难点】
const修饰常变量,如何理解?例如:const int a=10;这就定义了⼀个常变量a,a的值不可修改。
再论指针,指针有两个东西可变:
int a=10; int *p=&a;
1、指针指向的地址⾥⾯存放的值可变*p=5; //a的值变为5;
2、指向的指向可变int b=10; p=&b; //p的指向被改为a;
因此,const在不同地⽅修饰就有不同的效果
如:
(1)int a=10; const int *p = &a;
此时const修饰int,代表*p的值不可改变,也就是p指向的值不可以改变,但p的指向可以改;
(2)int a=10; int const *p = &a;
此时const修饰p,代表p的指向不可改变,但p的值可以改变。
(3)int a=10; const int* const p=&a;
由此类推此时p的指向和p指向的值都不可改变
9、void类型指针
void代表空,⼤家就很疑惑为什么指针还有空类型,有⼈可能以为void类型指针可以指向任何类型的数据,这种理解是错误的。应该理解为“指向空类型”或“不指向确定类型”的数据,那么如何指向空类型呢?举个例⼦:
int a=3;
int*p1=&a;
void*p2=(void*)p1;// 这⼀句就是将⼀个指向int类型的指针转化为空类型指针然后赋给p2;
cout<<(int*)p2<<endl;//在调⽤时,还得将空类型指针转换为原类型指针才可以调出数据
10、有关指针数据类型的⼩结
变量定义类型表⽰含义
int i;int定义为整型变量i
int *p;int *定义p为指向整型数据的指针
int a[5];int [5]定义⼀个整型数组
int *p[4];int *[4];定义⼀个指向整型数据的指针数据
int (*p)[4]int (*)[4]定义⼀个包含4个元素的⼀维数组指针变量
int f();int ()定义⼀个函数,返回值是整型
int *p()int *()定义⼀个返回值为整型指针的函数
int (*p)();int (*)()定义⼀个指向返回值为int类型的函数
int **p;int **定义⼀个指向【指向整型的指针】的指针
int const *p;int const *定义⼀个指向不可修改的指针
const int *p;const int *定义⼀个指向的值不可修改的指针
const int* const p;const int * const定义⼀个指向和指向的值都不可修改的指针
void *p;void *定义⼀个空类型指针
⼤家如果将这些全部弄清楚指针这块就差不多可以了 ^ _ ^
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论