指针与结构学习笔记

1.指针

前言

指针是一个值为内存地址的变量。对于指针如何规范的使用,想必大家已经很熟悉了。所以我并不想再啰嗦这一方面的知识。我想说说指针在应用方面的笔记,希望能对大家有用。

1.1指针的优势

1.在对特定类型的变量的计算时,如果其指针计算不仅可以减小代码内存大小,还可以缩短运算时间
因为通过使用指针,可以减少对内存的频繁读写操作,提高程序的执行效率。指针可以直接访问内存地址,避免了通过变量名访问内存的过程。

2.通过指针可以在主函数中修改被调函数中的值,反之亦可。

3.使用指针可以轻松地实现动态数据结构,如链表、树和图等。指针可以简化数据结构的操作,使得数据的插入、删除和查找等操作更加高效。

4.便于表示各种数据结构,指针可以表示各种数据结构,如数组、字符串、矩阵等,使得编写高质量的程序更加方便。

1.2指针的应用

1.指针在返回多个值中的应用
通常情况下一个函数使用return只能够返回一个值,而使用指针可以让一个函数返回多个值。
请看以下范例程序:
输入两个数,并通过立方函数返回他们的值。

#include <stdio.h>  
  
void lifang(int* pta, int* ptb) {  
    *pta = (*pta * *pta * *pta);  
    *ptb = (*ptb * *ptb * *ptb);  
}  
  
int main() {    
    int a = 3, b = 2;  
    lifang(&a, &b);  
    printf("%d %d", a, b);  
    return 0;    
}

通过上述方法我们就可以通过一个函数同时得到a,b的立方
2.函数间的参数传递
这个实现起来并不困难,大家都知道。
虽然我们也可以使用全局变量,但是全局变量有可能在不经意间被污染。而使用指针可以有效避免此种情况发生,而且在后续的代码维护与修改中,可以提高改进效率。
3.指针数组
在处理数组时,常有以下问题
字符数组只能一个一个字母地存,但是我想要一个数组元素存一个字符串我要如何实现呢?
请看以下范例程序:

#include <stdio.h>    
    
int main() {      
    char *pt[3]=  
    {  
        "I",  
        "love",  
        "szu"  
    };  
    printf("%s %s %s",pt[0],pt[1],pt[2]);  
    return 0;      
}

打印结果:I love szu
值得注意的是上面的指针打印时前面不需要加 *
这是因为在打印字符串时,printf函数会自动解析并输出指针变量前面的字符串,而不需要我们手动添加符号。因此,使用pt[0]可以直接打印出第一个字符串,而不需要在前面添加 * 。
如果我们使用的是整型指针数组那打印方式就有差别了

#include <stdio.h>  
  
int main() {  
    int a = 10, b = 20, c = 30;  
    int *ptr[3];  
  

    ptr[0] = &a;  
    ptr[1] = &b;  
    ptr[2] = &c;  
	 
    printf("a = %d\n", *ptr[0]);  
    printf("b = %d\n", *ptr[1]);  
    printf("c = %d\n", *ptr[2]);  

  
    return 0;  
}

在上面的代码中,ptr是一个指向整型数的指针数组,而不是一个字符串数组。因此,ptr[2]表示的是指向整型数的第三个指针,而不是一个字符串。

要打印ptr[2]所指向的整数值,我们需要使用符号来指示我们正在访问的是指针所指向的值而不是指针本身。

2.结构

2.1什么是结构?

结构,简单地说,就是一个“超级数组”,这个“数组”中的元素,可以是char类型,可以是int类型,也可以是forat类型。

2.2如何初始化与使用结构

初始化与使用

#include <stdio.h>    
struct book {
	char name[4];
};
int main() {      
         struct book library[2];//有两个book结构体
         scanf("%s",library[0].name );//可以通过这种方法输入,. 代表索引
		 printf("%s",library[0].name );//注意library[0]是第一个结构体,不要超出结构体数目范围
}

下面这段结合了指针,如何用指针访问我也写了

#include <stdio.h>      
struct book {  
 int name;  
};  
int main() {        
 struct book library[2];  
 struct book *pt1;  
 pt1=library;  
 pt1[0].name = 1;  //也可以通过这种方式初始化数组元素。下标访问相当与解引了,把这段改成pt1->name或(*pt1).name都可
 library[1].name = 2;//注意观察区别,下同(两种方式都可)  
 printf("%d %d",library[0].name ,pt1[1].name  );//结果:1 2  
 return 0;   
}

可能变量名有点奇怪,因为借用了第一个程序,希望不要介意。

2.3嵌套结构

简而言之就是“套娃”
请看下面范例:
结构b套住了结构a

#include <stdio.h>      
struct wa1 {  
   int num;
};  
struct wa2 {
     struct wa1 a;
};
int main() {        
 struct wa2 b;
 b.a.num =1;
 printf("%d",b.a.num);
 return 0;  //b套a
}

就此完,希望能对你有帮助。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lisabier

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值