c语言指针用法详解,c++语言指针
Yyds干货库存
什么是指针和指针类型?通配符指针指针操作指针和数组二级指针指针数组
一、指针是什么?
指针是编程语言中的一个对象。通过使用地址,它的值直接指向计算机内存中另一个地方的值。地址叫指针,就是他寻址的内存单元可以通过它找到。
注意:内存单元的编号,内存单元的地址和指针是一回事。
指针地址也是一个变量,一个用来存储地址的变量。
一个内存单元的大小是一个字节,给它一个数,就是地址。
int main()
{
int a=10//a占用4个字节
int * pa=a;//获取的第一个字节的地址。
//pa只是一个指针变量。
* pa=20
}注意:指针大小在32位平台上是4字节,在64位平台上是8字节。
二。指针和指针类型
1.指针大小
#包含stdio.h
int main()
{
char * pa
短* pc
float * pe
printf(%d\n ,sizeof(pa));
printf(%d\n ,sizeof(PC));
printf(%d\n ,sizeof(PE));
返回0;
}
//4 4 4注意:不管是什么类型的变量,大小在32位平台上是4字节,在64位平台上是8字节。
2.指针类型的含义
(1)指针-整数
#包含stdio.h
int main()
{
int a=0x11223344
int * pa=a;//在内存中:44332211
* pa=0;//调试检查内存后,在内存中变成0000000。
//char * pa=a;
//* pa=0;//调试检查内存后,可以看到在内存中变成00332211,后面没有变成0。
返回0;
}
//可以看出,指针类型不同,影响也不同。
可以看出,P和p 1的地址差是4,而pb和pb 1的地址差是1。
可以看出,p和p 2的地址差是8,而pb和pb 2的地址差是2。
总结:不同类型的指针有不同的能力来增加或减少地址。
走一步能走多远?
(2)指针的去引用
下图显示了内存中char*类型的解引用用于分配1个字节的1。
下图显示了在内存中对int* type的解引用用于分配4个字节的1。
指针的类型决定了指针有多少解引用的权限(它可以操作多少字节)。
三。野生指针
(1)概念:是指指针指向的位置是未知的(随机的、不正确的、没有明确限定的)
(2)原因:
1.指针未初始化。
#包含stdio.h
int main()
{
int * p;//p是局部指针变量。如果局部变量没有初始化,默认情况下它是一个随机值。
* p=10//不知道访问的地址是不是自己的,导致非法访问内存。
返回0;
} 2.指针越界访问
#包含stdio.h
int main()
{
int arr[10]={ 0 };
int * p=arr
int I=0;
for(I=0;i=10I )//当判断i=10时,会越界,造成越界。
{
* p=I;
p;
}
返回0;
}
3.指针所指的空间被释放。
#包含stdio.h
int* test()
{
int a=10
返回a;
}//返回时,的地址已经返回给操作系统
//但是程序返回后会记住这个地址,但是它已经不属于我们了。此时,访问是非法的。
int main()
{
int * p=test();//导致出现通配符指针
* p=20
返回0;
}注意:如何避免野指针
1.指针初始化2。小心指针超出界限3。指针指向要释放的空间,并及时设置NULL。
4.使用前检查指针的有效性。
int main()
{
//不知道p初始化什么值的时候,直接初始化为NULL
int * p=NULL
//c语言本身不会检查数据的越界行为。
//在使用之前检查指针的有效性
int *p=NULL
* p=10//当访问NULL时,这个地址不属于我们
返回0;
}
四。指针操作
1.指针整数
#包含stdio.h
#定义N_VALUES 5
int main()
{
浮点值[N _ VALUES];
float * vp
//指针-整数;指针的关系操作
for(VP=values[0];vp值[N _ VALUES];)//指针的关系运算
{
* VP=0;
}
返回0;
}2.指针-指针(获取两个指针之间的元素数量)
前提:两个指针指向同一个空间
#包含stdio.h
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10 };
printf(%d\n ,arr[9]-arr[0]);
//char b[5];
//printf(%d\n ,arr[9]-b[0]);//这种是不对的。
//两个指针相减必须指向同一个空间
}
//结果:9应用:计算字符串的长度
#包含stdio.h
#包含字符串. h
int my_strlen(char* str)
{
char * start=str
while (*str!=\0)
{
str
}
返回str-start;//指针指针
}
int main()
{
int len=my _ strlen( hxdlq );
printf(%d\n ,len);
返回0;
}注意:指针没有意义。
3.指针的关系操作。
//与后面相比
for(VP=VALUES[N _ VALUES];vp值[0];)
{
*-VP=0;
}
//与以前相比
for(VP=VALUES[N _ VALUES-1];vp=值[0];vp - ) {
* VP=0;} C语言中的标准规定数组元素的指针要和后面的比较,不能和前面的比较。
动词(verb的缩写)指针和数组
数组名是数组第一个元素的地址。
不及物动词次级指针
#包含stdio.h
int main()
{
int a=0;
int * pa=a;//pa是指针变量,一级指针
int * * ppa=pa//二级指针,存放指针变量的地址。
//pa也是一个变量,pa是存储在pa中的地址。
printf(%d ,* * PPA);
返回0;
}七。点阵
#包含stdio.h
int main()
{
int arr[10];//塑造数组
char ch[7];//字符数组
//指针数组3354存储指针数组
int * parr[5];//形状指针数组
char * PCH[5];//字符指针数组
返回0;
}转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。