专栏首页程序员互动联盟【编程基础】C语言之指针二

【编程基础】C语言之指针二

指针和数组

C语言的数组表示一段连续的内存空间,用来存储多个特定类型的对象。与之相反,指针用来存储单个内存地址。数组和指针不是同一种结构因此不可以互相转换。而数组变量指向了数组的第一个元素的内存地址。

一个数组变量是一个常量。即使指针变量指向同样的地址或者一个不同的数组,也不能把指针赋值给数组变量。也不可以将一个数组变量赋值给另一个数组。然而,可以把一个数组变量赋值给指针,这一点似乎让人感到费解。把数组变量赋值给指针时,实际上是把指向数组第一个元素的地址赋给指针。

int myarray[4] = {1,2,3,0};
int *ptr = myarray;
printf("*ptr=%d\n", *ptr);
// 数组变量是常量,不能做下面的赋值
// myarray = ptr
// myarray = myarray2
// myarray = &myarray2[0]

第1行初始化了一个int数组,第2行用数组变量初始化了一个int指针。由于数组变量实际上是第一个元素的地址,因此我们可以把这个地址赋值给指针。这个赋值与int *ptr = &myarray[0]效果相同,显示地把数组的第一个元素地址赋值到了ptr引用。这里需要注意的是,这里指针需要和数组的元素类型保持一致,除非指针类型为void。

指针与结构体

就像数组一样,指向结构体的指针存储了结构体第一个元素的内存地址。与数组指针一样,结构体的指针必须声明和结构体类型保持一致,或者声明为void类型。

struct person {
  int age;
  char *name;
};
struct person first;
struct person *ptr;

first.age = 21;
char *fullname = "full name";
first.name = fullname;
ptr = &first;

printf("age=%d, name=%s\n", first.age, ptr->name);

第1至6行声明了一个person结构体,一个变量指向了一个person结构体和指向person结构体的指针。第8行为age成员赋了一个int值。第9至10行我们声明了一个char指针并赋值给一个char数组并赋值给结构体name成员。第11行我们把一个person结构体引用赋值给结构体变量。

第13行我们打印了结构体实例的age和name。这里需要注意两个不同的符号,’.’ 和 ‘->’ 。结构体实例可以通过使用 ‘.’ 符号访问age变量。对于结构体实例的指针,我们可以通过 ‘->’ 符号访问name变量。也可以同样通过(*ptr).name来访问name变量。

本文分享自微信公众号 - 程序员互动联盟(coder_online)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-05-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【编程基础】数组和指针为什么不等价?

    好多初学C语言的人都认为数组和指针是相等的,在C 语言中对数组和指针的困惑多数都来自这句话。说数组和指针“等价”不表示它们相同, 甚至也不能互换。它的意思是说数...

    程序员互动联盟
  • 【答疑解惑第六讲】数组与指针区别在哪?

    存在问题: 小伙伴都说指针和数组不好学,总是搞不太清楚?两者到底有啥区别? 解决方案: 很多初学者朋友总是对数组和指针模模糊糊,搞不清楚。对他们之间的联系与区...

    程序员互动联盟
  • 【编程基础】C语言指针函数和函数指针

    往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂。下面详细为大家介绍C语言中指针函数和函数指针。 一、指针函数 当一个函数声明其返回值为一个指针时,实...

    程序员互动联盟
  • 基础知识 | 每日一练(64)

    士人有百折不回之真心,才有万变不穷之妙用。立业建功,事事要从实地着脚,若少慕声闻,便成伪果;讲道修德,念念要从虚处立基,若稍计功效,便落尘情。 ...

    闫小林
  • 指针与数组的关联3 --声明

        当我们在调用函数时,传递数组,就是把数组首元素的地址传递给函数,本质也就是给函数传递了一个指针变量。这时候我们会想那么数组是不是跟指针是一样的。为了验证...

    py3study
  • 常用技巧之JS判断重复

    如何判断数组中是否有相同的元素呢? 先来讲下思路: 现实中,要判断某个东西是否相同,那就意味着这东西至少是有2个或更多, 否则单个东西没法比较。 数组也是一样,...

    web前端教室
  • 小白搭建博客教程之流程

    2016-03-1209:03:37 发表评论 431℃热度 搭建个人博客其实说简单也简单,说难也难,当初我一个独自探索,到现在也差不多摸清门路了,因此写一个...

    timhbw
  • 登上《Cell》封面的AI医疗影像诊断系统:机器之心专访UCSD张康教授

    机器之心原创 作者:李泽南 人工智能(AI)有可能通过帮助人类医疗专家进行高难度分类、快速分析大量医疗图像的方式彻底改变疾病的诊断和治疗流程。近日,由加州大学圣...

    机器之心
  • 你的游戏代码“病”了吗?

    代码作为游戏的“身体”,一旦生病,在“奔跑”过程中便极可能”跌倒”。如果你的游戏出现过运行错误、宕机偶现问题,或者某些功能与预期不符。那么一起来看看是不是你的游...

    WeTest质量开放平台团队
  • 必备之常用正则表达式

    熟练而优雅的使用正则,对于程序员来讲,实在太有意义了(即便非此类者,也是好处多多);它辅助处理复杂的文本查询和字符串操作,不仅能用之于代码,还能雅之于编辑器,浏...

    晚晴幽草轩轩主

扫码关注云+社区

领取腾讯云代金券