结构体指针数据 指针数组 数组指针

1、结构体指针

struct h
{
BTNode *TQ;
int level;
}a[100], b, *c[3],  *d;

 
a是一个结构体数组,已经有100个节点了。不需要再分配空间了。
b是一个结构体变量,也已经有空间了,就和int b;已经有空间了一样。
c是一个指针数组,c也已经有空间了,有3个元素,但是这三个元素是还没有分配空间的指针,所以要用malloc分别为他们分配内存。
d是一个结构体指针,和int *d;一样还要为他分配内存空间;
其实结构体就可以理解为是一种和int这些一样的数据类型,它在定义变量和指针这方面的操作和基本数据类型是一样的。

结构体指针数组_win9zz的博客-CSDN博客_结构体指针数组

2、指针数组

如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组。其一般形式为:

            数据类型    *数组名[常量表达式][常量表达式]...... ;

它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定,每个元素都是一个指针。

 例如:char *arr[]={“Sunday”,“Monday”},存储了两个指针,第一个指针指向了字符串"Sunday",第二个指针指向了字符串"Monday",而sizeof(arr)=8,因为在32位平台,指针类型大小占4个字节。指针数组最重要的用途是对多个字符串进行处理操作,因为字符指针比二维数组更快更有效。
关于指针数组与数组指针详解(知识点全面)_利刃Cc的博客-CSDN博客_指针数组

3、数组指针(针对二维数组)

注:因为数组指针对于一维数组的使用比较尴尬,对于一维数组,建议使用指针数组比较方便,这里只涉及到关于二维数组与数组指针的知识!!!

首先引入二维数组的定义:二维数组在概念上是二维的,有行有列,但在内存中所有的元素都是连续排列的

关于指针数组与数组指针详解(知识点全面)_利刃Cc的博客-CSDN博客_指针数组

为了能更好地理解数组指针,与普通指针及二级指针的区别,下面举例说明一下。

例如:

{

 int a[4][5];

    int (*p)[5]=a;

}

这里a是个二维数组的数组名,相当于一个二级指针常量;//二维数组名与二级指针毫无关系(初学者常常混淆)。

p是一个指针变量,它指向包含5个int元素的一维数组,此时p的增量以它所指向的一维数组长度为单位;

p+i是一维数组a[i]的地址,即p+i==&a[i];对该式两边作取内容运算(*)得*(p+i)==a[i],由于二维数组中a[i]==&a[i][0],则*(p+i)表示a[i][0]的地址,即*(p+i)==&a[i][0];

*(p+2)+3表示a[2][3]地址(第一行为0行,第一列为0列),*(*(p+2)+3)表示a[2][3]的值。

//(*p)[5]其中的5换成其他的数字在vc++6.0环境中都无法通过编译

(*p)[5]其中的5在上述例子中没有表示任何意思你可以换成除0以外的整数,[5]的作用就是帮助你记忆说你所指向的一维数组的长度。(不过除了与定义的二维数组的长度一致的不会警告之外 )其他的数会警告但是不影响结果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
结构体数组是一种数据结构,它是由多个相同类型的结构体元素组成的数组。每个结构体元素可以包含多个不同类型的成员变量,这些成员变量可以用来表示一个实体的多个属性。 结构体指针是指向结构体的指针变量。通过结构体指针,可以方便地对结构体进行操作和访问。可以使用指针来访问结构体的成员变量,也可以通过指针修改结构体的值。 例如,下面是一个示例代码,展示了如何定义和使用结构体数组结构体指针: ```c #include <stdio.h> // 定义一个结构体 struct Person { char name[20]; int age; }; int main() { // 定义一个结构体数组 struct Person people[3]; // 初始化结构体数组 strcpy(people[0].name, "Alice"); people[0].age = 20; strcpy(people[1].name, "Bob"); people[1].age = 25; strcpy(people[2].name, "Charlie"); people[2].age = 30; // 遍历结构体数组并打印每个人的信息 for (int i = 0; i < 3; i++) { printf("Person %d: Name = %s, Age = %d\n", i+1, people[i].name, people[i].age); } // 定义一个结构体指针 struct Person *personPtr; // 将结构体数组的地址赋给结构体指针 personPtr = people; // 通过结构体指针访问和修改结构体的值 printf("First person's name: %s\n", personPtr->name); printf("First person's age: %d\n", personPtr->age); // 修改结构体的值 strcpy(personPtr->name, "David"); personPtr->age = 35; // 通过结构体数组访问修改后的值 printf("First person's name after modification: %s\n", people[0].name); printf("First person's age after modification: %d\n", people[0].age); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学如逆水行舟,不进则退3038

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值