C语言—浅析指针-创新互联
目录
隆回网站制作公司哪家好,找成都创新互联!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。成都创新互联从2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选成都创新互联。指针
一、什么叫做指针?
二、指针的类型
1.一级指针
2.二级指针
3.数组指针
4.函数指针
5.野指针
三、指针的运算
1.指针的赋值
2.指针的移动
3.指针-指针
指针 一、什么叫做指针?
指针是用来存放内存地址的变量,可以简单的理解为,指针就是地址,平时所说的指针通常都是说的指针变量。
举个例子,定义一个整形变量并初始化:
int a = 20;
int *p = &a;
此时我们就说指针变量p指向了a内存的地址,如果通过解引用(*)操作,则会得出这块内存中存储的值为20,这里要注意区分内存地址和内存储存了什么是两块不同的空间,地址在32位机器上只占4个字节,在64位机器上占8个字节。
和其他变量一样,指针也可以进行初始化,初始化如下:
int *p = NULL;
二、指针的类型指针大致可以分为以下几种类型:
1.一级指针一级指针就是我们常见的普通指针,例如上述的一个定义指针的例子,就是一个一级指针,除了int型的一级指针之外,还有其他常见的一级指针。
char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;
2.二级指针二级指针指的是指向一级指针的指针,里面存储的是一级指针的地址,通过*解引用操作可以找到一级指针中存放的内容,二次解引用**可以找到一级指针指向的地址的内容,如下,便是一个二级指针,输出为10
int a = 10;
int *p = &a;
int **pa = &p;
printf("%d",**pa);
3.数组指针数组指针,就是指向数组的指针,里面存放的是一维数组的地址其中一种形式如下:
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int(*p)[10] = arr;
我们就说*p是一个数组指针,指向的数组拥有十个元素,每个元素类型是int类型,这里需要注意的是,如果写成int *p[10] = arr(去掉括号),则会变成一个指针数组而不是数组指针,因为[ ]的优先级高于*,所以p先和右边的[ ]相结合了
4.函数指针该指针指向的是一个函数的地址,如下便是一个函数指针为:
void (*p)();
5.野指针概念:野指针是指指针指向的内存地址是未知的(随机、不正确、没有明确限制的都算未知)
既然知道了什么是野指针,那么有哪些操作容易产生野指针呢?
1.对指针定义时未进行初始化,指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它所指的空间是随机的。
int main()
{
int * p;
*p = 10;
return 0;
}
2.指针越界访问:指针指向的范围超出了合理范围,或者调用函数时返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。
int main()
{
int arr[10] = {0};
int *p = arr;
for(int i = 0; i<= 11; i++)
{
*(P++) = i;//当i=11时,指针指向的范围超出数组arr的范围,p变成野指针。
}
return 0;
}
3.指针释放后未置空:有时指针在free或delete后未赋值 NULL,便会使人以为是合法的。其实它们只是把指针所指的内存给释放掉,但并没有把指针本身忘记。此时指针指向的就是无效内存。
int main()
{
int *p = NULL;
p = malloc(10 * sizeof(int));//malloc函数为开辟内存
if (!p)
{
return;
}
free(p);//释放了内存,故要马上给p赋值为空指针NULL
p = NULL;
return 0;
}
所以要避免成为野指针,就应当尽量多的避免上述三种操作
三、指针的运算 1.指针的赋值指针的赋值通常有如下形式:
指针变量=&变量
指针变量=指针变量
指针变量=NULL
指针的移动通常为指针±整数,在下面的例子中,每一次循环,指针p将跳到下一个地址,因为这里是int类型的数组,所以将跳过四个字节(关于指针移动到底跳过多少个字节,笔者会在之后再做总结,这里不在叙述)
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;
for (int i = 0; i< 10; i++)
{
p = p + 1;
printf("%p\n", p);
}
return 0;
}
3.指针-指针得到的是指针之间的元素个数
最后,这是笔者的第一篇博客,水平有限,如有解析不到之处请各位多多批评指正
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
本文名称:C语言—浅析指针-创新互联
文章起源:http://hbruida.cn/article/dechcd.html