破除c语言学习第一难关——指针

举报
莫浅子 发表于 2022/10/20 22:39:59 2022/10/20
【摘要】 ​ ​编辑指针和内存单元    指针: 地址。    内存单元: 计算机中内存最小的存储单位。——内存单元。大小一个字节。 每一个内存        单元都      有一个唯一的编号(数)。称这个内存单元的编号为 “地址”。      指针变量:存地址的变量。指针定义和使用    int a = 10;    int *p = &a;               int* p;--- wi...

 编辑


指针和内存单元

    指针: 地址。


    内存单元: 计算机中内存最小的存储单位。——内存单元。大小一个字节。 每一个内存        单元都      有一个唯一的编号(数)。称这个内存单元的编号为 “地址”。

  

    指针变量:存地址的变量。




指针定义和使用

    int a = 10;

    int *p = &a;               int* p;--- windows;    int *p ---Linux       int * p ;

   *p : 将p变量的内容取出,当成地址看待,找到该地址对应的内存空间。

        如果做左值: 存数据到空间中。

        如果做右值: 取出空间中的内容。

举个例子

int  a = 10;
int *p = &a;
a = 350
cout<<a<<endl;
cout<<*p<<endl;

 这里的结果都是350

1、开始的时候a 为 10 ,然后地址为0xff00

2、然后p指针存放者a的地址

3、a 值修改为350,通过指针使得*p的内容最终为350

编辑


注:如果第三行代码改为为 *p = 2000,那么查询 a 和 *p 值都会改为2000,因为 *p指向的就是a的空间



 任意“指针”类型大小

        指针的大小与类型 无关。 只与当前使用的平台架构有关。   32位:4字节。     64位: 8字节。

#include <stdio.h>
int main()
{
	printf("sizeof(int *) = %u\n", sizeof(int *));
	printf("sizeof(short *) = %u\n", sizeof(short *));
	printf("sizeof(char *) = %u\n", sizeof(char *)); 
	printf("sizeof(long *) = %u\n", sizeof(long *));
	printf("sizeof(double *) = %u\n", sizeof(double *));
	printf("sizeof(void *) = %u\n", sizeof(void *));
	
}

结果都是 8


野指针

1) 没有一个有效的地址空间的指针

 int *p;

 *p = 1000;


 2)p变量有一个值,但该值不是可访问的内存区域。

 int *p = 10;

 *p = 2000;

【杜绝野指针】 



空指针

int *p = NULL;

*p 时 p所对应的存储空间一定是一个无效的访问区域



万能指针/泛型指针(void *)

    可以接收任意一种变量地址。但是,在使用【必须】借助“强转”具体化数据类型

char ch = 'R';

void *p;  // 万能指针、泛型指针
        
p = &ch;

printf("%c\n", *(char *)p);


指针和数组 

 数组名: 

【数组名是地址常量】 --- 不可以被赋值。     ++ / -- / += / -= / %= / /=  (带有副作用的运算符)

  指针是变量。可以用数组名给指针赋值。 ++ -- 

取数组元素

 int arr[] = {1,3, 5, 7, 8};

 int *p = arr;  

 arr[i] == *(arr+0) == p[0] == *(p+0)

    指针和数组区别:

        1. 指针是变量。数组名为常量。

        2. sizeof(指针) ===》 4字节 / 8字节

           sizeof(数组) ===》 数组的实际字节数。

    指针++ 操作数组:

    

        int arr[] = { 1, 2, 4, 5, 6, 7, 8, 9, 0 };
        int *p = arr;        
        int n = sizeof(arr) / sizeof(a[0]);
        for (size_t i = 0; i < n; i++)
        {
            printf("%d ", *p);
            p++;  // p = p+1;   一次加过一个int大小。 一个元素。
        }

    p的值会随着循环不断变化。打印结束后,p指向一块无效地址空间(野指针)。




指针加减运算

数据类型对指针的作用:

       1)间接引用:

            决定了从指针存储的地址开始,向后读取的字节数。  (与指针本身存储空间无关。)

        2)加减运算:

            决定了指针进行 +1/-1 操作向后加过的 字节数。

    指针 * / % : error!!!

    指针 +- 整数:

   1) 普通指针变量+-整数

            char *p; 打印 p 、 p+1  偏过 1 字节。

            short*p; 打印 p 、 p+1  偏过 2 字节。

            int  *p; 打印 p 、 p+1  偏过 4 字节。        
    
      2)在数组中+- 整数

            short arr[] = {1, 3, 5, 8};

            int *p = arr;

            p+3;            // 向右(后)偏过 3 个元素

            p-2;            // 向前(左)偏过 2 个元素


       3)&数组名 + 1

            加过一个 数组的大小(数组元素个数 x sizeof(数组元素类型))

  

    指针 +- 指针:

    指针 + 指针: error!!!

    指针 - 指针:

     1) 普通变量来说, 语法允许。无实际意义。【了解】

      2) 数组来说:偏移过的元素个数。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。