C/C++数组指针

6 篇文章 0 订阅

数组指针(点击访问B站视频)

1.    内存四区
    1)    代码区:代码
    2)    全局区:全局变量、静态变量以及常量
    3)    栈区:系统自动开辟,系统自动释放。并不是很大。
    4)    堆区:动态开辟的内存,手动开辟,手动释放。大。

2.    地址:把内存以单个字节为单位,分开。对每一个字节编号,这个编号就是地址。
    a)    编号是连续(即地址是连续的)
    b)    唯一的
    c)    取地址运算符:& 单目运算符 优先级() []  结核性:从右往左
        int a; // a 一个内存
        &a;


3.    首地址:一段内存空间中第一个存储单元的地址。存储单元。

4.    1)指针变量:
        (1)用来存放地址的变量。
        (2)内存大小4Byte(4字节)
            地址是一些编号,一种数据:
            整型 int a;
            字符 char b;
            小数 float c;
            地址 指针变量 int *p;
    2)指针变量的定义:数据类型 *变量名
        int *p;//定义一个指针变量,存的是地址!!
        //int 指明指针指向的数据类型
        //*指明p这个变量是一个指针变量
        char *p1;//p1保存一个字符型变量的地址
        float *p2;//p2保存一个单精度浮点型变量的地址
    3)指针变量的赋值

        int a = 5, *p;
        p = &a;//p指向a
        cout << a << endl;//5
        cout << "p指向的内存中的值:" << *p << endl;//5
        cout << "p" << p << endl;//p006FF9A8


    4)    指针变量的引用
        访问a这个int变量
        使用变量名
        指针访问:*指针变量。*取值运算符。返回某一地址中的值。单目运算符,结合性:从右到左。
        注意点:在定义指针变量的时候int *p;*只是表明p是一个指针变量。

5.    野指针:不能明确指向的指针变量。危险。
      int *p;//p里面保存的地址不确定的,p指向是不确定的。重要数据
    int *p = NULL;

6.    空指针:int*  float*  char*  double*
    void *转换成其他的数据类型。
    动态内存分配 malloc new

7.    指针变量的运算:
     +   -   ++   --  指针偏移去访问地址旁边的内存。
    指针变量的加减,以指针所指向的类型空间单位进行偏移。

    char *p;   //char    1   p+1    1B
    int *p1;   //int     4   p1+1   4B
    double *p2;//double  8   p2+1   8B

8.    一维数组与指针
(1)定义一个一维数组,数组名是这个数组的首地址。
    Int a[5];
    A指向a[0],a[0]int的元素,a的类型就是int *
    &a 这个地址指向整个数组 &a类型 int(*)[5]
(2)访问数组元素
a. 下标法

    int a[5] = { 1,2,3,4,5 };
    for (int i = 0; i < 5; i++)
            cout << a[i] << " ";

b. 指针法
    不改变指针指向:

        int a[5] = { 1,2,3,4,5 };
        int *p = a;//p指向a[0]
        //*p;//a[0]
        //p + 1;//a[1]的地址
        //*(p + 1);//a[1]
        for (int i = 0; i < 5; i++)
            cout << *(p+i) << " ";

    改变指针指向:

        int a[5] = { 1,2,3,4,5 };
        int *p = a;//p指向a[0]
        for (int i = 0; i < 5; i++)
            cout << *p++ << " ";//* 和 ++优先级相同,结合性从右往左
            //指针先移动后取值

数组名和指针的区别_findgeneralgirl的博客-CSDN博客_数组名和指针的区别https://blog.csdn.net/findgeneralgirl/article/details/78501734?utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~B

    法3:

        int a[5] = { 1,2,3,4,5 };
        for (int i = 0; i < 5; i++)
            cout <<*(a+i) << " ";
            //cout <<*a++ << " ";
            //不可以使用*a++
    //a是数组名 也是首地址,也是数组名不能够随意改变。不能改变,会报错
            //a看成一个指针常量。看成,不是指针

9.    二维数组与指针
int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
数组名a
 
a指向a[0]这个一维数组。A的类型是 int (*)[4],a+1 则地址+16Byte (其中16=二维数组的列数*sizeof(int))  相当于行指针;
a[0]指向a[0][0];a[0]的类型:int *,a[0]+1  4B
二维数组是由3个一维数组组成的,所以一位数组就是二维数组的一个存储单元。

a是二维数组的首地址。a是二维数组中第一个存储单元(一维数组)
&a; int (*) [3][4];  &a+1  48B=3*4*sizeof(int)

int a[2][3][4];

a指向二维数组
a[0]指向一位数组
a[0][0]指向一个元素。

i行j列的元素:
    a[i][j]
    *(a[i]+j)
    *(*(a+i)+j)

a指向a[0]
a+1指向a[1]

a的类型:        int (*)[4];
&a的类型:       int (*)[3][4];
a [0] 的类型:   int *
a [0][0] 的类型:int

10.    多维数组:从高到低拆
&a        指向8维
a
a[0]
a[0][0]
a[][][]       int(*)[][][]
a[][][][]      int(*)[][]
a[][][][][]     int(*)[] 
a[][][][][][]    int *
a[][][][][][][]   int

8维数组:
a[1][2][3][4][5][6][7][8];

a为数组名:
a指向7维数组
a[0]指向6维数组
a[0][0]指向5维数组


【指针的其他知识】:
指针数组:int *[]
数组指针:int(*)[]
函数指针
指针形参的函数:
结构体指针
字符串与指针:
指向指针的指针:
数据结构:

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用指针来实现数组和链表之间的转换。具体来说,可以定义一个指向链表节点的指针,然后遍历数组中的元素,将每个元素插入到链表中。以下是一个示例代码: ```c #include <stdio.h> #include <stdlib.h> struct ListNode { int val; struct ListNode *next; }; struct ListNode* arrayToList(int* nums, int size) { struct ListNode* head = NULL; struct ListNode* tail = NULL; for (int i = 0; i < size; i++) { struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode)); node->val = nums[i]; node->next = NULL; if (head == NULL) { head = node; tail = node; } else { tail->next = node; tail = node; } } return head; } void printList(struct ListNode* head) { while (head != NULL) { printf("%d ", head->val); head = head->next; } printf("\n"); } int main() { int nums[] = {1, 2, 3, 4, 5}; int size = sizeof(nums) / sizeof(nums[0]); struct ListNode* head = arrayToList(nums, size); printList(head); return 0; } ``` 在上面的代码中,我们定义了一个结构体 `ListNode`,表示链表节点。然后定义了一个函数 `arrayToList`,用于将数组转换为链表。在函数中,我们遍历数组中的每个元素,创建一个新的节点,并将其插入到链表中。最后返回链表的头节点。我们还定义了一个函数 `printList`,用于打印链表中的所有元素。在 `main` 函数中,我们调用 `arrayToList` 函数将数组转换为链表,并调用 `printList` 函数打印链表中的所有元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Catherinemin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值