指针 内存中的五大区域

IOS学习第13天

指针

  • 指针为什么要分类型

1.不管是什么类型的指针,都是占8个字节

2.指针的类型如果不和指向的变量的类型相同的话,那么通过指针就无法正确的操作指向的变量

通过指针操作变量是,指针变量的类型决定了要操作多少连续字节的空间

  • 多级指针
1.一级指针:
    首先是一个指针,存储了一个普通变量的地址
    int num  =10;
    int *p_num = #
    二级指针:
    首先是一个指针,存储了一个一级指针的地址
    int num  =10;
    int *p_num = #
    int** pp_num = &p_num;
    100级指针:
    首先是一个指针,存储了一个99级指针的地址

2.n级指针的使用
    int num = 10;
    int * p_num = #//一级
    int ** pp_num = &p_num;//二级
    int *** ppp_num = &pp_num;//三级指针
    打印num的值
    %d用来输出num
    %d用来输出*p_num
    %d用来输出**pp_num
    %d用来输出***ppp_num;
    ```
* ** 指针与证书之间的加减法**

1.我们可以声明1个指针变量指向数组的元素.通过指针间接的操作数组的元素.

2.数组名 就是一个地址 它保存了数组的首地址,也是数组第0个元素的地址
int arr[] = {10,20,30,40,50,60,70};
int *p1 = &arr[0];
int *p2 = arr

3.遍历数组的三种方式
指针 + 1 === > 指针的值 + sizeof(所指向元素的数据类型)
(int*类型的指针) 0xfff001 + 1 实际上 ==>0xfff005

1>使用指针遍历数组的第一种方式.
int arr[7] = {10,20,30,40,50,60,70};
int* p1 = &arr[0];//p1指针指向了数组的第0个元素.

//    p1+0 p1+1 ...p1+6
for(int i = 0;i < 7;i++){
    printf("%d ",*(p1+i));
}

2>使用指针遍历数组的第二种方式.
int arr[7] = {10,20,30,40,50,60,70};
//arr是数组名,就是一个地址 存储了 &num[0]

for(int i = 0;i < 7;i++){
    printf("%d ",*(arr+i));
}


3>使用指针遍历数组的第三种方式.
int arr[7] = {10,20,30,40,50,60,70};
int* p1 = arr;

for(int i = 0;i < 7;i++){
    printf("%d ",*(p++));
    //通过p++ 也可以是指针p依次指向所有元素
}

// 以下这种方式不行
// int arr[7] = {10,20,30,40,50,60,70};
// int* p1 = arr;
//

// for(int i = 0;i < 7;i++){
// printf(“%d “,*(arr++));//这里不行,因为arr是数组名,数组名是一个地址,但是这个数组名存储的地址是一个常量

// }

注意点:

1.不能给数组名重新赋值,这个地址是在定义数组的时候系统分配
2.指针变量+1的本质:指针变量的值+sizeof(指针应该指向的数据的类型)

* 中括弧的本质

1.指针变量后面可以使用中括弧,在中括弧中写上下标来访问数据.

2.p1[n],前提p1必须是一个指针
p1[n] <==>*(p1 + n);

3.其实操作数组的数据 使用下标的时候,本质上
int nums[] = {1,2,3,4,5};
nums[3];//4这个数
*(nums + 3);//也是访问4这个数据
“`

  • 存储指针的数组
1.存储指针的数组: 简称 指针de数组 (数组指针)


2.申明格式:
    数据类型* 数组名[长度];
    int num1 = 10;
    int num2 = 100;
    int num3 = 1000;
    //定义一个数组 存储了三个变量
    int nums[] = {num1,num2,num3};
    //定义一个数组 存储了三个变量的地址
    int * p_nums[] = {&num1,&num2,&num3};

//   要访问 num1的值
    printf("num1 = %d\n",num1);
    printf("num1 = %d\n",nums[0]);
    printf("num1 = %d\n",*(p_nums[0]));
  • 指针与指针之间的减法运算

1.指针相减的意义:代表两个指针指向的变量之间相差多少个单位变量

2.指针相减的前提:这两个指针必须指向同一个数组中的元素

字符串

  • 内存中的五大区域
1.不同的区域是来干嘛的?为什么要分五个区域?[了解]
    不管是那1个区域都是来存储数据的.
    不同的数据存储在不同的区域.方便系统的管理.


2.内存中的五大区域?(面试题)
    a.栈
      存储局部变量
    b.堆(OC是必须明白)
      程序员手动的申请指定字节的空间
    c.bss段
      未初始化的全局或者静态变量
    d.DATA段/数据段/常量区/全局区/静态区
      已初始化的全局或者静态变量,或者常量
    e.代码段
      存储二进制代码
  • 存储字符串数据的两种方式的区别
1). 当他们都是局部变量的时候.
char name1[] = "jack";//name1存储在栈,"jack"的每一个字符,存在数组中的,也就是栈区

char *name2 = "rose";//name2存储在栈,但是"rose"是存常量区

2). 当他们作为全局变量的时候.
char name1[] = "jack";//name1存储在常量区,"jack"每一个字符,都是存储在数组中的,也就是常量区

char* name2 = "rose";//name2存储在常量区,"rose"也是常量区,name2这个指针 指向了"rose"这个字符串的首字母的地址


3). 二者还有区别

char name1[] = "jack";
    name1[0] = 'U';//可以改的

char* name2 = "rose";
    name2[0] = 'R';//不允许,因为"rose"是一个常量
  • 字符串数组

“`
1.字符串数组:一个数组,每一个元素是一个字符串

2.如何存储字符串数组?
1>二维的字符数组: char name[] = “jack”;
char [][20] = {“jack”,”lilei”,”marryluck”,”jackmarrylilei”};

2>一维指针数组:
char * names[4];//指针数组中每一元素 是 char*的类型
names[0] = "jack";
names[1] = "lilei";
names[2] = "marryluck";
names[3] = "jackmarrylilei";

char * names[4] = {"jack","lilei","marryluck","jackmarrylilei"};

数组的长度:sizeof(数组名)/sizeof(char*)
```
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值