08 C语言指针
创始人
2024-06-01 00:24:40
0

08 C语言指针

1、取地址运算

  1. 取地址运算符 & 是一元运算符,用于返回一个变量或对象在内存中的地址。例如,如果有一个名为x的变量,那么&x将返回x在内存中的地址。除了对变量进行取地址运算,还可以对指针变量进行取地址运算,得到指针变量本身的地址。例如,如果有一个名为p的指向int类型变量的指针变量,那么&p将返回p在内存中的地址。
  2. 取地址运算符 & 只能对具有内存地址的变量进行操作,因为只有变量才会在内存中占用一定的空间,才能有地址。因此,不能对常量、表达式、函数名等进行取地址运算。
  3. 取出来的地址大小取决于编译器和处理器的架构。在32位系统中,地址通常是4字节长,而在64位系统中,地址通常是8字节长。在一些嵌入式系统中,地址可能只有2字节或更少。
  4. 为了打印地址,可以使用 %p 格式化字符,例如:printf(“The address of x is %p”, (void*)&x); 在使用%p格式化字符打印地址时,需要将地址强制转换为void指针类型,这是因为%p只接受void指针类型的参数。
  5. 在内存中,变量地址是按照从低地址到高地址的顺序分布的,自底向上分布。数组名是数组首个元素的地址,而相邻的数组元素的地址之间相差一个数据类型的大小。例如,如果一个整数数组的第一个元素的地址为0x1000,那么第二个元素的地址为0x1004(如果是32位系统),第三个元素的地址为0x1008,以此类推。指针变量也是如此,指针变量在内存中的地址也是按照从低地址到高地址的顺序分布的,自底向上分布。

2、指针变量

  1. int *p 的含义是 p 是一个指向 int 类型变量的指针变量,而不是指针存放的地址是 int 类型。
  2. 指针变量存储的值是一个内存地址,它指向一个具有有效值的普通变量。
  3. 当一个指针被解引用时,使用指针所指向的地址读取或写入该地址中存储的值。
  4. * 作为一元运算符,可以用于访问一个指针变量所指向地址中存储的值。作为左值进行赋值时,可以修改指针变量所指向地址中存储的值。
  5. & 运算符可以取出一个变量的内存地址,而 * 运算符可以通过一个指针变量访问该地址中存储的值。它们是相互关联的操作,但并不是相互反作用的。

3、指针的应用场景

1、交换两个变量。

2、函数返回值不止一个;传入的参数就是需要保存带回来的结果。

2、函数返回运算状态,结果用指针返回。

指针必须指向一个变量,否则直接访问会对不明确的地址进行访问,会有严重错误。

4、指针与数组

1、在函数的参数列表里面,数组int a[] == int * == int *a,但是可以通过[]进行数组运算。

2、数组变量是const指针,所以无法把一个数组直接赋值给另一个数组,因为数组变量存放的地址是数组首个变量的地址,为常量不可以修改。

3、[]和*符号可以对数组进行操作,可以对指针进行操作。

5、指针与const

1、指针本身可以是const,变量本身也可以是const

2、* const 表示的是指针是const,*const p = q说明,p当中只能是q的地址,不可被修改。类似于数组a[10]当中,a[]和a表达的是 * const ,指针常量不可修改

3、const *表示不可以通过指针去改变变量,但指针所指的变量不会变成const

4、传参数的时候可以使用const*避免变量被修改。

5、const int a[10],表面数组的每个变量都是const,所以必须初始化才能赋值。

6、在传参数的时候防止数组被破坏,可以将数组参数设置为const。

6、指针计算

  1. *p++ 这个表达式会先取出指针 p 指向的地址上的值,然后将指针 p 加上它指向的数据类型的大小,指向下一个地址。例如,如果 p 是一个 int 类型的指针,那么 *p++ 将会先取出 p 所指向地址上的 int 值,然后将 p 加上 sizeof(int),指向下一个 int 类型的地址。
  2. 两个指针相减得到的是它们之间相差的地址数量,也就是它们之间隔了多少个数据类型大小的空间。例如,如果 p1p2 都是 int 类型的指针,那么 p2 - p1 的结果将是两个指针之间隔了多少个 int 类型的大小。这个值通常被称为指针之间的偏移量。
  3. *p++ 表达式的执行过程是先取出 p 所指向地址上的值,然后将 p 加上它指向的数据类型的大小,指向下一个地址。因此,*p++ 的结果是取出 p 所指向地址上的值。这个表达式实际上等价于 *(p++)
  4. 不同类型的指针之间不能相互赋值,这是因为不同类型的指针所指向的内存结构是不同的。即使它们的地址大小相同,它们指向的数据类型也可能不同,因此在使用指针的时候需要格外小心,避免出现类型不匹配的问题。

7、动态内存分配

  1. 数组动态申请内存int *p =(int *)malloc(sizeof(int) * n) 这行代码的意思是,申请一个长度为n的int类型数组,p指向这段内存的首地址。由于malloc返回的是void类型指针,需要进行强制类型转换。
  2. 动态申请的内存是字节为单位的。 malloc函数申请的内存是以字节为单位的,因此需要通过sizeof运算符计算需要申请的字节数。
  3. 如果申请失败了,返回的是0 如果内存申请失败,malloc函数会返回一个NULL指针。因此,我们需要在申请内存后检查返回值是否为NULL,以确定是否申请成功。
  4. 申请完地址,需要free,malloc和free参数需要一致。 在动态内存分配中,申请到的内存空间需要手动释放。使用free函数可以释放已申请的内存。需要注意的是,释放内存时需要确保指针参数与申请内存时返回的指针参数一致,否则会出现不可预料的问题,甚至导致程序崩溃。

相关内容

热门资讯

评书童林传250回的和300回... 评书童林传250回的和300回的有什么不一样?内容上是完全一样的,只是在剪辑时语速有所不同。 ...
为啥 有声小说凡人修仙传 和 ... 为啥 有声小说凡人修仙传 和 修真世界 很久都不更新了呢? 播音大灰狼去干吗了?凡人修仙传 和 修真...
月宫的主人不是嫦娥,你知道《封... 月宫的主人不是嫦娥,你知道《封神榜》中姜子牙封了谁吗?大家口中所说的嫦娥在历史上,其实并不是一个人,...
华软科技涨1.15%,成交额6... 7月1日,华软科技盘中上涨1.15%,截至09:57,报6.17元/股,成交6068.05万元,换手...
时间久了是不是真的会忘记? 时间久了是不是真的会忘记?如果那时是真的伤到了心,是不会忘记的,只会淡化,再久的时间想起来还是会有一...
菲沃泰涨1.21%,成交额66... 7月1日,菲沃泰盘中上涨1.21%,截至09:58,报16.76元/股,成交662.09万元,换手率...
党员总数超28.77万名 基层... 来源:本站原创  安庆市委组织部最新党内统计数据显示,截至2024年底,安庆市共有中国共产党党员28...
三棵树成立新材料科技子公司 转自:证券时报人民财讯7月1日电,企查查APP显示,近日,三棵树(海南)新材料科技有限公司成立,注册...
正海生物涨1.07%,成交额9... 7月1日,正海生物盘中上涨1.07%,截至09:43,报20.72元/股,成交936.02万元,换手...
奥联电子跌1.01%,成交额1... 7月1日,奥联电子(维权)盘中下跌1.01%,截至09:44,报15.69元/股,成交1018.39...