c语言指针数组和结构体的指针

  指向数组的指针,先初始化一个数组,使用传统方式遍历

1 void main()
2 {
3     int a[5] = { 1,2,3,4,5 };
4     for (int i = 0; i < 5; i++)
5     {
6         printf("%d,%x\n", a[i], &a[i]);
7         printf("%d,%x\n",*(a+i),a+i); //等价 a[i] , &a[i]
8     }
9 }

  a就是数组a的首地址,即元素1的地址, a + 1 代表 地址+1,即这里就是增加 int型 4字节的长度, 指向下一个地址即元素2的地址

1 int a[5] = { 1,2,3,4,5 };
2 int *p = NULL; //创建一个空指针
3 p = a;//p是一个指针变量,a就是 数组首地址 元素1的地址    

  因为我们利用指针遍历同样能达到效果

1 //利用指针循环
2 for (int *pp = a; pp<a+5; pp++)  //地址++
3 {
4     printf("%d,%x\n",*pp, pp);
5 }

  有了上面的理解,指针结构体其实是一样的。

 1 //指针结构体
 2 struct info
 3 {
 4     char name[50];
 5     int id;
 6 };
 7
 8 void main()
 9 {
10     struct info myinfo[5] = { {"zc1",1},{ "zc2",2 }, {"zc3",3}, {"zc3",3}, {"zc4",4} };
11
12     //常规方式输出
13     for (int i = 0; i < 5; i++)
14     {
15         printf("%s,%d\n",myinfo[i].name, myinfo[i].id);
16         //指针
17         printf("%s,%d\n", (*(myinfo+i)).name, (*(myinfo + i)).id);
18     }
19
20     //利用指针循环
21     struct info *px = myinfo;
22     for (; px < myinfo; px++)
23     {
24         printf("%s,%d\n", px->name, px->id); //指针结构体输出方式  指针变量->属性
25         printf("%s,%d\n", (*px).name, (*px).id); //指针结构体输出方式  *指针变量.属性
26         // px->id等价 (*px).id
27     }
28
29     getchar();
30
31 }

    

  

时间: 2024-10-09 04:18:35

c语言指针数组和结构体的指针的相关文章

结构体指针数组和结构体数组指针的区别

对于初学者的我来说,面对又是数组又是结构体还有指针,一下子就蒙了,在网上查找资料也没有相应的介绍,经过我的测试终于明白了其中的猫腻:结构体数组指针 *[]struct:结构体数组指针的指针是数组的指针,即表示数组的地址,数组里面存放的是结构体类型结构体指针数组 []*struct:即指针表示结构体的地址,数组里面存放的是结构体的指针有什么解释不对的地方请指正 代码测试:package mainimport ( "fmt") type XCDataStu struct { Id int

EDKII CR宏:根据成员指针获取父结构体变量指针

核心提示: 1. CR宏 (Containing Record):根据成员指针获取父结构体变量指针 2. 0 指针的妙用. 在EDKII 的代码中有不少关于CR宏的使用,如 时钟中断处理函数CoreTimerTick. VOID EFIAPI CoreTimerTick ( IN UINT64 Duration ) { IEVENT *Event; ... if (!IsListEmpty (&mEfiTimerList)) { Event = CR (mEfiTimerList.Forward

指针 指针与数组 指针与字符串 指针与函数 结构体与指针 宏

指针 指针与数组 指针与字符串 指针与函数?? 指针与数组 1.数组名:数组元素首地址 eg: int array[3]={1,3,6}; 这里array 恒等于&array[0] 2.int *p = a; int *p = 0; int a[]={0}; 3.int *p = a; 均指向数组的首地址 *p是? *(p+1)是?(*p)+1是? *(p+1)决定向下移动几个字节是类型 4.指针可以当数组名使用 p[1] = 3; 恒等于a[1] ;恒等于*(p+1);恒等于*(a+1) 5.

黑马程序员 C语言-枚举,结构体,指针

一.枚举 ※枚举变量的定义 前面只是定义了枚举类型,接下来就可以利用定义好的枚举类型定义变量. 跟结构体一样,有3种方式定义枚举变量 1.先定义枚举类型,再定义枚举变量 enum Season {spring, summer, autumn, winter}; enum Season s; 2.定义枚举类型的同时定义枚举变量 enum Season {spring, summer, autumn, winter} s; 3.省略枚举名称,直接定义枚举变量 enum {spring, summer

编程题:指针变量指向结构体数组。

编程题:指针变量指向结构体数组. #include<stdio.h> void main() { struct person {char name[20]; char sex; int age; float height; }per[3]={{"Li Ping",'M',20,175},{"Wang Ling",'F',19,162.5}, {"Zhao Hui",'M',20,178}}; struct person *p; for

C提高4 多维数组,结构体与二级指针

昨天的试题:原题见昨天作业题 [email protected]:~/high/day03$ cat main.c  /* 二级指针,绝佳训练题1 */ #include <stdio.h> #include <stdlib.h> #include <string.h> int spitspring(char *buf1,char *c,char **myp,int *total) { char *p_head =  buf1; char *p_tail =  buf1

c语言:通过指向结构体变量的指针变量输出结构体变量中成员的信息

通过指向结构体变量的指针变量输出结构体变量中成员的信息. 解:程序: #include<stdio.h> #include<string.h> int main() { struct Student { long int num; char name[20]; char sex[10]; float score; }; struct Student stu_1;//定义struct Student类型的变量stu_1 struct Student *p; p = &stu_

深入了解Windows句柄到底是什么(句柄是逻辑指针,或者是指向结构体的指针,图文并茂,非常清楚)good

总是有新入门的Windows程序员问我Windows的句柄到底是什么,我说你把它看做一种类似指针的标识就行了,但是显然这一答案不能让他们满意,然后我说去问问度娘吧,他们说不行网上的说法太多还难以理解.今天比较闲,我上网查了查,光是百度百科词条“句柄”中就有好几种说法,很多叙述还是错误的,天知道这些误人子弟的人是想干什么. 这里我列举词条中的关于句柄的叙述不当之处,至于如何不当先不管,继续往下看就会明白: 1.windows 之所以要设立句柄,根本上源于内存管理机制的问题—虚拟地址,简而言之数据的

黑马程序员学习笔记--------C语言变量类型,结构体,枚举

本章学习的知识是定义结构体,枚举等自定义的数据类型,已经宏命令,变量类型等细小的知识点,在开始本章的新知识学习之前首先我们要明白的是C语言有丰富的数据类型和运算符,因此计算能力非常强大,计算过程中使用的值一般用变量来存储.变量也是有分类型的,不同类型的变量有不同的存储类型.不同的生命周期.不同的作用域,C语言也提供了一些关键字来设置变量的属性(比如设置存储类型.生命周期). 一.变量类型 变量分为全局变量和局部变量. 首先说明一下局部变量的特点 1> 定义:在函数内部定义的变量,称为局部变量.形