指针的定义
- 指针的本质就是内存地址;
- 指针变量存储的是指针,也就是存储内存地址的变量;
- 在计算机世界中,内存地址其本质也是一个整型数值;也就是说指针变量的值是一个整数.
指针的声明
int *p1;
上述是声明了一个指向int类型的指针变量p1;
指针的先声明然后再初始化
int a = 100;
int *p1;
p1 = &a;
指针的声明与初始化
int a = 100;
int *p1 = &a;
指针变量在内存中所占的字节数
int a1 = 100;
char a2 = 'a';
float a3 = 1.23;
int a4[5] = {1,2,3,4,5};
int *p1 = &a1;
char *p2 = &a2;
float *p3 = &a3;
int(*p4)[5] = &a4;
NSLog(@"a1=%lu/a2=%lu/a3=%lu/a3=%lu",sizeof(a1),sizeof(a2),sizeof(a3),sizeof(a4));
NSLog(@"p1=%lu/p2=%lu/p3=%lu/p3=%lu",sizeof(p1),sizeof(p2),sizeof(p3),sizeof(p4));
Snip20201215_4.png
本人使用的是Xcode开发工具,测试机是真机iPhone7,真机的系统版本为13.3.1;
从控制台的打印结果来看.
与指针相关的运算符
- 取址运算符
- 格式: &变量名
- 含义: 取变量的内存地址
- 取值运算符
- 格式: *指针名/内存地址名
- 含义: 取出内存地址中存储的值
//声明一个整型变量a并初始化为100
int a = 100;
//声明一个指向整型变量的指针变量p;
int *p;
//初始化指针变量p
p = &a;
*p = 300;
NSLog(@" a的地址=%p -- p的地址=%p -- p的值=%p",&a,&p,p);
NSLog(@" 取出指针中的存储值 = %d",*p);
NSLog(@" a = %d",a);
Snip20201216_21.png
从控制台的打印结果来看:
- 变量a的地址与指针变量p的值相等,表明指针变量的值就是变量的内存地址;
- *星号运算符有两种含义:
第一: 在指针变量的声明中,表明变量是存储内存地址的变量即指针变量;
第二: 在指针变量声明初始化之后,取出指针变量所指向内存地址中的值,即取值运算;
第三: *p = 300,是指修改p所指向的内存地址中的值,即修改变量a的值.
指针的运算
- 加法/减法运算
int a = 100;
int *p;
p = &a;
NSLog(@"指针的值=%p -- 指针中存储的值 = %d",p,*p);
p = p + 1;
NSLog(@"指针的值=%p -- 指针中存储的值 = %d",p,*p);
p = p + 1;
NSLog(@"指针的值=%p -- 指针中存储的值 = %d",p,*p);
p = p + 1;
NSLog(@"指针的值=%p -- 指针中存储的值 = %d",p,*p);
Snip20201215_6.png
更改变量的数据类型为char类型
char a = 'a';
char *p;
p = &a;
NSLog(@"指针的值=%p -- 指针中存储的值 = %d",p,*p);
p = p + 1;
NSLog(@"指针的值=%p -- 指针中存储的值 = %d",p,*p);
p = p + 1;
NSLog(@"指针的值=%p -- 指针中存储的值 = %d",p,*p);
p = p + 1;
NSLog(@"指针的值=%p -- 指针中存储的值 = %d",p,*p);
Snip20201215_7.png
- 首先int类型数据在内存中占用4个字节,char类型数据在内存中占用1个字节;
- 当指针变量指向int类型数据时,指针变量+1或者-1,其指针变量的值 +4或者-4;
- 当指针变量指向char类型数据时,指针变量+1或者-1,其指针变量的值 +1或者-1;
- 所以指针变量+1或者-1,其指针变量值的变化与其所指向数据类型在内存中所占的字节数相关.
指针变量,指针常量,常量指针,常量指针常量之间的区别
- 指针变量: 指针的值(指针的指向)可以改变,可以通过指针去修改变量的值;
- 指针常量: 指针的值(指针的指向)不能改变,可以通过指针去修改变量的值;
- 常量指针: 指针的值(指针的指向)可以改变,不能通过指针去修改常量的值;
- 常量指针常量: 指针的值(指针的指向)不能改变,不能通过指针去修改常量的值;
//变量 值可以改变
int a = 100;
int b = 500;
a = 200;
//常量 值不可以改变
const int c = 200;
const int d = 400;
c = 700; //报错
//指针变量
int *p1 = &a;
p1 = &b;
*p1 = 600;
//指针常量 指针的值固定
int * const p2 = &b;
*p2 = 900;
p2 = &d //报错
//常量指针 指向常量的指针
const int * p3 = &d;
p3 = &c;
*p3 = 600; //报错
//常量指针常量
const int * const p4 = &a;
p4 = &b; //报错
*p4 = 1000; //报错












网友评论