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