前言


  • 我个人觉得其实当代的计算机书籍都已经落伍很多年了,如果再按照严蔚敏版的《数据结构》学习这些结构体这些东西,我觉得是得不偿失的。所以在大家看这篇博客的时候,我建议大家思考一下是否真的需要使用指针?是否真的需要使用结构体?


1.申请一个指针之后,必须将这个指针指向某个具体的地址,这样这个指针才具有作用,比如以下代码。

#include <stdio.h>

typedef struct {
char bookISBN[20];//书号
char bookName[20];//书名
int price;//数据项
}Book;//这里的Book为单纯的节点

int main(){
Book book;//新建一个Book型结构体
scanf("%s %s %d",&book.bookISBN,&book.bookName,&book.price);
//printf("%s %d\n",book.bookName,book.price);

Book *b;//声明一个Book型的指针
b =&book;//为这个指针b指向节点book
//b = book; 错误使用指针 => [Error] cannot convert 'Book' to 'Book*' in assignment
printf("%s %s %d\n",b->bookISBN,b->bookName,b->price);
}

/**测试数据

0001 计算机网络 23

0002 数据结构 34

**/

分析


  • 定义一个结构体Book,里面的属性有两个​​char[]​​​数组,一个​​int​​型变量。
  • 在main函数中,定义一个Book型变量book,这个book是一个具体的结构体节点,输入值到其中。
  • 我们新建一个​​Book*​​型的指针,指向刚才申请的book节点,这要就可以访问到book的具体内容了。
  • 需要注意的是:​​b = &book;​​ 这一步是将 book 的地址赋给指针b,从而b能够访问book 中的值。如果没有这么做,那么出现的错误就是:不能讲Book型变量转换成Book*(指针)型。
  • 对于指针型变量,我们需要使用 ​​b->price​​​,而非 ​​b.price​​ 。

2. 例2

2.1 代码

#include<cstdio>
#include<iostream>

using namespace std;

int main(){
int a[5] = {1,2,3,4,5};
cout <<"&a = "<< &a <<"\n";
cout <<"&a + 1 = "<< &a + 1<< "\n"; //加的是一个数组的整个字节内容 【】
cout <<"a = "<< a<<"\n";
cout <<"*a = "<< *a<<"\n";
cout <<"*(a + 1) = "<< *(a + 1)<<"\n";
}

2.2 分析

​&a + 1; //加的是一个数组的整个字节内容 【即int 是4个字节,5个int,就是20字节,用16进制的表示就是14。】​

2.3 执行结果

C指针详解_数据结构