C语言指针的定义及基本使用

C语言指针的定义及基本使用指针是 C 语言中一个非常重要的概念 也是 C 语言的特色之一 使用指针可以对复杂数据进行处理 能对计算机的内存分配进行控制 在函数调用中使用指针还可以返回多个值 地址和指针是计算机中的两个重要概念 在程序运行过程中 变量或者程序代码被存储在以字节为单位组织的存储器中 在 C 语言中 如果定义了一个变量 在编译时就会根据该变量的类型给它分配相应大小的内存单元

写在前面:学习的第一门语言是Java,之前对C也了解一点,也只是了解一点,在加上长时间没有接触了,基本就只会一个Hello World了。现在由于准备升本考试,不得不从头开始学C。这里从零开始,记录C语言学习点滴。欢迎正在学习C语言的小伙伴一起学习,未来可期,一起加油!

指针是C语言中一个非常重要的概念,也是C语言的特色之一。使用指针可以对复杂数据进行处理,能对计算机的内存分配进行控制,在函数调用中使用指针还可以返回多个值。

地址和指针

地址和指针是计算机中的两个重要概念,在程序运行过程中,变量或者程序代码被存储在以字节为单位组织的存储器中。在C语言中,如果定义了一个变量,在编译时就会根据该变量的类型给它分配相应大小的内存单元。例如:假设int类型变量占 2 个字节,则需要分配 2 个字节的内存单元。

计算机为了对内存单元中的数据进行操作,一般是按“地址”存取的,也就是说对内存单元进行标识编号。假设如下有变量定义:

int x = 18, y = 24, z = 20; 

指针变量的定义

int i, *p; 

指针变量用于存放变量的地址,由于不同类型的变量在内存中占用不同大小的存储单元,所以只知道内存地址,不能确定该地址上的对象。因此在定义指针变量时,除了指针变量名,还需要说明该说明指针变量所指向的内存空间上所存放数据的类型。如下:

int *p; /* 定义一个指针变量P,指向整形变量 */ char *cp; /* 定义一个指针变量cp,指向字符型变量 */ float * fp; /* 定义一个指针变量fp,指向实型变量 */ double *dp1, *dp2; /* 定义两个指针变量dp1和dp2,指向双精度实型变量 */ 

定义多个指针变量时,每个指针变量前面都必须加上*
指针变量的类型不是指指针变量本身的类型,而是指定它所指向的变量的数据类型。

定义指针及指针赋值

int i, *p; p = &i; p = 0; p = NULL; p = (int *) 100; 

在定义指针变量时,要注意以下几点。

  1. 指针变量名是一个标识符,要按照C标识符的命名规则对指针变量进行命名。
  2. 指针变量的数据类型是它所指向的变量的类型,一般情况下一旦指针变量的类型被确定后,他只能指向同种类型的变量。
  3. 在定义指针变量时需要使用指针声明符 * ,但指针声明符并不是指针的组成部分。例如:定义int *p;说明p是指针变量,而不是*p;

指针的基本运算

如果指针的值是某个变量的地址,通过指针就能间接访问那个变量,这些操作由取地址运算符&和间接访问运算符 * 完成。此外,相同类型的指针还能进行赋值、比较和算术运算。

1、取地址运算和间接访问运算
单目运算符 & 用于给出变量的地址。例如:

int *p, a = 3; p = &a; 

将整型变量a的地址赋给整型指针p,使指针p指向变量a。也就是说,用运算符&取变量a的地址,并将这个地址值作为指针p的值,使指针p指向变量a。

指针的类型和它所指向变量的类型必须相同。

#include 
  
    int main(){ int a = 3, *p; /* 定义整型变量a和整型指针p */ p = &a; /* 把变量a的地址赋给指针p,即p指向a */ printf("a = %d, *p = %d\n", a, *p); /* 输出变量a的值和指针p说指向变量的值 */ *p = 10; /* 对指针p所指向的变量赋值,相当于对变量a赋值 */ printf("a = %d, *p = %d\n", a, *p); printf("请输入a的值:"); scanf("%d", &a); /* 输入a */ printf("a = %d, *p = %d\n", a, *p); (*p)++; /* 将指针所指向的变量加1 */ printf("a = %d, *p = %d\n", a, *p); return 0; } 
  
int a = 1, x, *p; p = &a; x = *p++; 

指针p先指向a,其后的语句x = *p++;将p所指向的变量a的值赋给变量x,然后修改指针的值,使得指针p不再指向变量a。

2、赋值运算
一旦指针被定义并赋值后,就可以如同其他类型变量一样进行赋值运算。例如:

int a = 3, *p1, *p2; /* 定义整型变量指针p1和p2 */ p1 = &a; /* 使指针p1指向整型变量a */ p2 = p1; 

只能将一个指针的值赋给另一个相同类型的指针。

指针变量的初始化

指针变量在定义后需要先赋值再引用。在定义指针变量时,可以同时对它赋初值。例如:

int a; int *p1 = &a; /* 在定义指针p1的同时给其赋值,使指针p1指向变量a */ int *p2 = p1; /* 在定义指针p2的同时对其赋值,使p2和p1的值相同,都指向变量a */ 

在进行指针初始化的时候需要注意一下几点。

  1. 在指针变量定义或者初始化时变量名前面的“ * ”只表示该变量是个指针变量,它既不是乘法运算又不是间接访问符。
  2. 把一个变量的地址作为初始化值赋给指针变量时,该变量必须在此之间已经定义。因为变量只有在定义后才被分配存储单元,它的地址才能赋给指针变量。
  3. 可以用初始化了的指针变量给另一个指针变量作初始化值。
  4. 不能用数值作为指针变量的初值,但可以将一个指针帮你初始化为一个空指针。例如:int *p = 1000; 是不对的,而int *p = 0; 是将指针变量初始化为空指针。这里0是ASCII字符NULL的值。
  5. 指针变量定义时的数据类型和它说指向的目标变量的数据类型必须一致,因为不同的数据类型所占用的存储单元的字节数不同。

由于初学C语言,上述内容如有错误地方,恳请各位大佬指出!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228034.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午7:58
下一篇 2026年3月16日 下午7:59


相关推荐

  • 视觉SLAM十四讲习题答案

    视觉SLAM十四讲习题答案阅读 视觉 SLAM 十四讲 中遇到的问题及习题资源整理 或为原创 或来自网络 如有问题请与我联系 会在第一时间加以修正 后来自己写完看到另一位写的博客 相形见绌 大家可以互相结合的看 第一讲 1 线性方程的解 转载自宋洋鹏 youngpan1101 了解线性代数可关注 B 站 3Blue1Brown 以及线性代数 知乎上有其精细笔记 2 高斯分布参考这位博主 Johnny Cuii 的文章 具体

    2026年3月19日
    2
  • bootstrap自定义样式-bootstrap侧边导航栏的实现[通俗易懂]

    bootstrap自定义样式-bootstrap侧边导航栏的实现[通俗易懂]1.侧滑栏使用定位fixed2.使用bootstrap响应式使用工具类visible-smvisible-xshidden-xshidden-sm等对不同屏幕适配3.侧滑栏的侧滑效果不使用jquery方法来实现,使用的是css3transforms属性进行div的移动,侧滑的动画效果使用的是css属性transition

    2022年4月30日
    48
  • Spring整合Sharding-JDBC分库分表详情

    Spring整合Sharding-JDBC分库分表详情Spring整合Sharding-JDBC分库分表详情一、概述最初线上系统的业务量不是很大,业务数据量并不大,比如说单库的数据量在百万级别以下(事实上千万级别以下都还能支撑),那么MySQL的单库即可完成任何增/删/改/查的业务操作。随着业务的发展,单个DB中保存的数据量(用户、订单、计费明细和权限规则等数据)呈现指数级增长,那么各种业务处理操作都会面临单DB的IO读写瓶颈带来的性能问题。S…

    2022年6月14日
    29
  • python怎样换行输出_python换行输出

    python怎样换行输出_python换行输出如何用 python 将内容换行输出这样我输入 欢迎来到 CSS 布局 HTML 后 1 txt 中的原内容 我好欢迎来到 CSS 布局 HTML 大家好 变成了 我下载 writerow 查询可以得到下图内容 输出的 csv 的效果是 行末是 CR 然后才是一个 CRLF 的换行使用 binary 模式即可改为就能解决问题了 python 中怎么换行 怎么从第一行换到第二行的 Windows 换行符是 r n

    2026年3月18日
    2
  • 第十四章《redis》

    第十四章《redis》

    2021年5月29日
    90
  • think in java interview-高级开发人员面试宝典(八)

    think in java interview-高级开发人员面试宝典(八)JavaIO流的复习。大家平时J2EE写多了,JAVA的IO操作可能都已经生疏了,面试时如果来上这么几道,是不是有点”其实这个问题很简单,可是我就是想不起来“的感觉啊?呵呵!JAVA的IO操作太多,我这边挑腾迅,盛大和百度的几道面试题,并整理出答案来供大家参考。InputFromConsole这个最简单不过了,如果你不复习的话,嘿嘿,还真答不出,来看:packageorg.sky.io;p

    2022年5月30日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号