C语言指针初阶学习笔记-创新互联
1.指针
当前标题:C语言指针初阶学习笔记-创新互联
网站地址:http://myzitong.com/article/dhipgo.html
定义:存储其他变量地址的变量。(32位:4bit 64位:8bit)
成都创新互联公司专注于宿迁企业网站建设,响应式网站,商城网站建设。宿迁网站建设公司,为宿迁等地区提供建站服务。全流程按需求定制开发,专业设计,全程项目跟踪,成都创新互联公司专业和态度为您提供的服务2.指针类型的意义1.指针类型决定了指针解引用的权限有多大(即能够访问多长的字节)。
int *pi=a; //pi为整形指针,解引用访问时可以访问四个字节
char *pr=a; //pr为字符型指针,解引用访问时只能访问一个字节
2.决定了走一步的距离。
int *pi=a; //整形指针
char *pr=a; //字符型指针
pi+1; //假设pi存储的地址为0x0012ff40,执行+1操作后,pi指向0x0012ff44
pr+1; //假设pr存储的地址为0x0012ff40,执行+1操作后,pi指向0x0012ff41
3. 野指针定义:指针指向的位置是不可知的。(随机的、不正确的、没有明确限制的)
3.1 出现野指针的原因:①指针未初始化
int *p; //指针变量未初始化,默认为随机值
*p=20; //非法访问内存
int *p=NULL; //指针进行了初始化
②指针越界访问
int a[3]={1,2,3};
int *pa=a;
printf("%d",*(pa+2)); //访问数组第3个元素
printf("%d",*(pa+3)); //数组的长度为3,在此处访问数组的第“4”个元素,超出了数组的地址范围,故为野指针
③指针指向的空间释放
当你向内存申请了一块空间,并用指针指向了这块空间。当这块空间被释放以后,指针并未及时释放,依旧指向的是这块空间。此时就是野指针。就像张三跟女朋友分手以后,张三每天给他的前女友电打话骚扰她,这并不合法。
int *ddd()
{int a=10;
return &a;
}
int main()
{int *p=ddd(); //函数返回a的地址,但a是函数内的局部变量,当函数返回时,a的地址已经被释放了,但指针p依旧指向这个地址,所以这里p变成了野指针
*p=10;
}
3.2 如何规避野指针①指针要初始化
int *pi=NULL;
char *pc=NULL;
②小心指针越界
③指针指向空间释放后及时置空
free(ptr); //释放指针指向的空间
ptr=NULL; //指针置空
④指针使用之前检查是否有效
if(p!=NULL)
*p=10;
4. 指针运算
4.1 指针+整数int a[3]={1,2,3};
int *pa=a;
for(int i=0;i<3;i++)
{printf("a[%d] = %d",i,*(pa+i)); //可用于实现遍历数组
}
4.2 指针-指针指针-指针:得到的是两个指针之间的元素个数。(条件:这两个指针必须指向同一块空间)
int a[5] = {1,2,3,4,5 };
printf("%d\n", &a[4] - &a[0]); //输出值为4
return 0;
4.3指针的关系运算int a[5] = {1,2,3,4,5 };
int *pa=a;
for(pa;pa<&a[5];pa++)
{printf("%d\n",*pa);
}
注:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
5. 指针和数组数组名表示的数组首元素的地址。C语言在表示数组时借用了指针。定义arr[n]的意思是*(arr+n),到内存arr的位置,然后移动n个单元,检索存储在那里的值。因此,当输出数组第1位元素的值时可以演变出以下几种方式。
int a[5] = {1,2,3,4,5 };
int *p = a;
printf("%d\n", a[1]);
printf("%d\n", 1[a]);
printf("%d\n", *(a + 1));
printf("%d\n", *(p + 1));
printf("%d\n", p[1]);
printf("%d\n", 1[p]);
6. 二级指针一级指针指向某个变量的地址。顾名思义,二级指针指向指向了某个变量地址的一级指针。如图所示:
int a = 10;
int *p = &a;
int **pp = &p;
printf("%d", **pp); //二级指针的解引用
6.指针数组指针数组是数组,就像好孩子是孩子一样。在指针和数组中间加个“的”,即为指针的数组。顾名思义,就是存放指针的数组。
int a[5]; //整形数组
char b[5]; //字符型数组
int * p[5]; //指针数组
该笔记是学习了B站up主:鹏哥C语言 的课程所写。课程传送门
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
当前标题:C语言指针初阶学习笔记-创新互联
网站地址:http://myzitong.com/article/dhipgo.html