C语言指针往往是C语言学习过程中最困难的地方, 最近重新理解了一下C语言的指针知识, 在此整理一下, 如果有错误请留言指正.

对于刚入门的人来说, 指针涉及方方面面, 从简单的数组到结构体, 都会用到指针.

指针根据应用不同的地方, 功能也是不同的, 在此尽量以最简单的方式进行叙述.


一. 指针基础知识

指针应用主要分为两个方面, 一是定义阶段. 另一个是使用阶段.

1. 定义阶段

int *p;

这里表示定义了一个int型指针, 即*p指向内存中一块地址, 占用4个字节(后面会进行解释4字节, 但是简单一提是int类型占用4字节, double占用8字节).

int a=1;int *p=&a;

此处与上面不同的地方是在定义指针的同时, 将其指向的地址赋初值为1, 即将*p指向的地址存入int类型的数且该数为1.

2. 使用阶段

*p=;

前面已经定义了int型的指针, 且指针指向的地址赋初值为1. 这里想把*p指向的地址中的值赋为2, 则使用*p=2.

这里比较混乱的地方是下面这种情况:

*p    //表示操作*p中的数值, 即*p为一个数值
p      //表示地址, 及地址号

这里一定要区分明白*p

二. &的说明

在指针的使用过程中还要注意的一个符号就是&, 这个&符号表示寻找地址. 使用方法如下:

;
int *p=&a;       //这里&表示寻找到a的地址, 并将其赋给指针p
printf("%d\n",*p);  //输出2

这一段代码可以这么理解, 定义一个int型指针, 改指针指向了a变量的地址, 所以最后printf的过程最后寻找到变量a的地址然后输出.

三. 指针在数组中使用

这里再给出数组中指针的简单实用, 代码如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    ]={,};  //定义数组a(0)=111, a(1)=999. 目的是便于区分输出值
    int *p;         //定义int指针p
    p=a;           //将数组a的首地址给指针p
    printf("%d\n",*p);    //输出111
    printf());//输出999, 因为此时指针p指向a(1)的地址
    ;
}

下面代码涉及指针的移动问题:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    ;
    int *p;
    p=&a;
    printf("%#X\n",p);    //十六进制输出p的地址, 我的机器输出OX28FF14
    printf());  //输出OX28FF18
    double b=99.9;
    double *q=&b;
    printf("%#X\n",q);    //输出OX28FF08
    printf());  //输出OX28FF10
    ;
}

这里int与double地址输出的值不同, 原因是int和double占用的字节数不同. int占用4字节, double占用8字节, 所以当int型指针+1移动时实际移动4个字节的地址, 而double则移动8个字节的地址. 可以类比到float与char类型.

字符串在此不解释, 可以当做特殊数组进行处理.

四. 错误示例解析

下面给出一些错误示例

;  //出错原因指针未指向明确的地址就赋值//此段代码等价int *p;p=1;     //前面说过p为地址, 这里给地址赋值为1.
int *p;    //原因同上
*p=;

转载请注明出处, O(∩_∩)O谢谢!

最新文章

  1. [APAC]查找资产表
  2. E-Eating Together(POJ 3670)
  3. 使用JS动态创建含有1000行的表格
  4. MYSQL操作的一些知识点,持续更新中&#183;&#183;&#183;&#183;
  5. UI设计师不可不知的安卓屏幕知识
  6. poj3067树状数组求逆序数
  7. Azure 认知服务 (5) 计算机视觉API - 使用C#代码实现读取图片中的文字(OCR)功能
  8. 微信小程序- 生成二维码
  9. SDP(3):ScalikeJDBC- JDBC-Engine:Fetching
  10. hive权威指南&lt;一&gt;
  11. kubernetes入门(10)kubernetes单机安装后 - helloworld
  12. js替换字符串中特殊字符
  13. MySQL 优化集锦
  14. error: ‘kEmptyString’ is not a member of ‘google::protobuf::internal’
  15. [android] 图片的缩放
  16. 自动检测ie低版本,并显示升级浏览器的自定义页面,当用f12再把浏览器版本提高的时候,又会自动显示正常的页面。
  17. 26.pymysql、pymongo、redis-py安装
  18. Vue.js学习和第一个实例
  19. 转载ORM--EF框架
  20. Oracle sql语句中(+)作用

热门文章

  1. 用C++设计一个不能被继承的类(转)
  2. DataGridView.DataSource= list(Of T)
  3. sed系列:行或者模式匹配删除特定行
  4. Kubernetes对象之ReplicaSet
  5. vue directive demo
  6. bzoj-2251 外星联络
  7. 【BZOJ4956】lydsy七月月赛 I 乱搞
  8. 关于Darwin接入私有协议、私有SDK码流的讨论
  9. g++: command not found的解决
  10. 为自己编写的windows应用程序制作安装包