- 作者:老汪软件技巧
- 发表时间:2024-09-20 11:01
- 浏览量:
一、指针基础
变量有两种访问方式:
直接访问,通过变量名访问间接访问,通过指针访问1.什么是指针
用于专门存储地址的变量就是指针变量,通常简称指针。
64为系统使用64位表示地址,所以其指针占用8字节。
32位系统使用32位表示地址,其指针占用4字节。
2.指针的定义
一般格式:
数据类型 *标识符 = 地址;
int *num = &a;
下面的写法都是合法的:
int *num = &a;
int* num = &a;
int * num = &a;
3.&和*
int a = 1;
int *num = &a;
printf("%d", *num);
二、指针运算1.指针加减
指针与整数加减表示指向的地址的位移对应的数据单位,移动多少与指针数据类型有关。
比如int *p = &a;,p+1表示地址加4,p-1表示地址减4。
2.同类型指针相减
同类型指针相减结果表示地址相差多少个数据单位。高位地址减去低位地址,返回的是正值;低位地址减去高位地址,返回的是负值。
同类型指针相减的结果是一个 ptrdiff_t 类型数据,ptrdiff_t 类型是一个带符号的整数,格式输出中对应的格式占位符是 %td
3.指针比较
指针比较是直接比较其指向地址的大小,返回的是int类型1或0。
三、指针和数组1.数组名
*数组名在大多数情况下会隐式的转换为第一个元素的指针(唯独sizeof的时候不会转换)。*基本可以当成指针,具有指针的大部分特性。
数组名和指针的区别:
数组名表示符常量,不能改变;指针可以改变。sizeof 数组名得到的是整个数组的大小; sizeof 指针得到的是指针的大小。
#include
int print(int arr[])//形参也为地址!
{
printf("%zu\n", sizeof arr);//8
}
int main()
{
int arr[3] = {1,2,3};
int (*p)[3] = arr;
printf("%zu\n", sizeof arr);//12
printf("%p\n", arr);//地址
printf("%p\n", p);//地址
return 0;
}
2.指针数组
指针数组是一个数组,其每一个元素为指针。
数据类型 *指针数组名[长度];
int *arr[3] = {&a,&b,&c};
3.数组指针
数组指针是一个指针,其指向一个数组的地址。注意,数组指针指向的是整个数组的地址而不是第一个元素的地址。
数据类型 (*数组指针名)[长度];
int (*p)[3] = &arr;
上面的数组指针一个单位数据长度为12,所以p+1表示地址+12。
4.字符指针
字符指针变量(简称字符指针)是C语言中的一种指针类型,它用于指向字符或字符串(字符数组),通常用于处理字符串(字符数组)。
char *pStr= "hello tom";
指向字符串字面量常量的字符指针的特点:
相对于字符数组名,字符指针可以修改指针,指向新的字符串。不能通过下标修改某个字符。字符指针不能接收scanf输入的字符串。总结:
int arr[5] = {10,20,30,40,50}; // arr 数组名
int *ptr = arr; // ptr 显式定义的首元素指针
int (*arr_ptr)[5] = &arr; // arr_ptr 是数组指针
标识符性质数据类型sizeof 计算结果+1 的值* 取值(解引用)能否重新赋值(可变性)
arr
数组名
int [5]
整个数组的大小
第二个元素地址
首元素值
否
ptr
首元素指针
int *
地址大小
第二个元素地址
首元素值
是
arr_ptr
数组指针
int (*)[5]
地址大小
数组后面地址(越界)
数组名(首元素地址)
是