c语言指针用法:1、指针变量与普通变量一样默认值不确定,一般初始化为NULL;2、指针变量的用法与普通变量不同,一般以p结尾加以区分;3、指针变量的类型决定了通过指针变量访问内存时访问几个字节。
c语言指针用法:
一,指针定义:
指针变量的取值范围取值0~4G,是一种数据类型(无符号整数,代表了内存编号)。它可以用来定义变量(与int、long一样),与int、long不同的它存储整数代表了内存的编号,通过这个变量可以访问对应编号的内存。
二,指针的作用
1、堆内存无法取名字(无法使用标识符与堆内存建立联系),必须配合指针。
2、函数之间的参数是值传递(内存拷贝),使用指针可以优化参数的传递效率(需要对变量进行保护)。因为C语言采用的是值传递(内存拷贝),会随着变量字节数的增加而降低运行效率而传递变量的地址永远只拷贝4或8字节。
void func(const int* p);
但使用指针变量的值可能会被修改,可以配合const。
3、函数之间是相互独立的,有时协同配合需要共享变量(全局变量过多会造成命名冲突,不会被释放浪费内存),函数之间传递变量的地址可以达到共享变量的效果。
三,指针的用法:
定义:类型* 变量名_p;
1、指针变量与普通变量一样默认值不确定,一般初始化为NULL。
2、指针变量的用法与普通变量不同,一般以p结尾加以区分。
3、指针变量的类型决定了通过指针变量访问内存时访问几个字节。
4、指针变量不能连续定义(一个*只能定义出一个指针变量):
int* p1,p2;
// p是指针,p2是int类型变量
int *p1,*p2;
// p1和p2都是指针变量
赋值:指针变量 = 内存编号。 变量名_p = 地址;
内存编号要能够访问,如果编号错误可能会造成段错误。void*可以与任意类型指针进行自动转换(C++中不行)。要保障地址与物理内存有对应关系(映射过),否则有段错误。
int* p = malloc(4); int* p = # // 引用内存
访问:*指针变量 //解引用—-访问指针变量
根据指针变量中存储的内存编号去访问对应的内存。如果之前赋值的内存编号有误,这个步骤会出现段错误。访问的字节由指针类型决定。 int* p = #
*p <=> num;
5,指针运算
指针变量中存储的就是整数,因此为整型数据能使用的运算符指针变量基本都能使用
,但不是所有运算都有意义。
指针+整数 = 指针+宽度*整数
指针-整数 = 指针-宽度*整数 // 指针进行前后移动
指针-指针 = (指针-指针)/宽度 // 两个指针之间相隔多少个元素
指针 >、<、<=、>= 指针 可以判断两个谁在前谁在后。
6,数组与指针
.数组名就是个特殊的地址,也能当指针使用,数组名是个常量(数组名与数组第一个元素的首地址是对应关系,普通指针是指向关系)。数组名可以使用指针的解引用,而指针变量也可以使用数组的[];arr[i] <=> *(arr+i)。数组当函数的参数就脱变成了指针变量,长度丢失,安全性也变小void func(int * const arr,size_t len);
7,指针的高级使用
数组指针与指针数组:
(1).数组指针(指针):专门用来指向数组的指针。
int arr[10]; int (*p)[10] = arr; int* p = #