C语言初级阶段7——指针4
C语言初级阶段7——指针4
结构体指针
1.概念:所谓的结构体指针就是指向结构体变量的指针,一个结构体变量的起始地址就是这个结构体变量的指针。如果把一个结构体变量的其实地址存放在一个指针变量中,那么这个指针变量就指向此结构体变量。
2.结构体指针的定义
如有以下结构体:
struct student{int id;char *name;char sex[4];}s1,s2,s3;
则可以定义指向struct student类型结构体的指针:
struct student *sp;
sp = &s1;//用结构体指针sp指向struct student类型的结构体变量s1.
#include<stdio.h>
typedef struct nodeDate
{
int a;
char name[20];
}node;
void main()
{
node n;//n是结构体变量
node* p = &n;//p是一个结构体指针
p->a = 20;//结构体指针通过箭头(->)进行访问。
printf("%d\n", n.a);
}
#include<stdio.h>
typedef struct nodeDate
{
int a;
char name[20];
}node;
void main()
{
node n[5] = {
{1,"aaa"},
{2,"bbb"},
{3,"ccc"},
{4,"ddd"},
{5,"eee"}
};
node* p[5] = {&n[3],&n[2]};
printf("%d\t%s\n", p[0]->a,p[1]->name);
}
#include<stdio.h>
typedef struct nodeDate
{
int a;
char name[20];
}node;
void main()
{
node n[5] = {
{1,"aaa"},
{2,"bbb"},
{3,"ccc"},
{4,"ddd"},
{5,"eee"}
};
node* p = n;
printf("%d\n",p->a);
printf("%d\n", (p+2)->a);
printf("%s\n", (p+2)->name);
printf("%d\t%s\n", (*(p+2)).a,(*(p+4)).name);
}
内存分配
1.动态内存分配:从堆区申请内存,自己使用。
2.通过函数进行申请:malloc、calloc、realloc。
3.从堆区申请的内存是通过指针进行管理的。
4.使用free函数进行释放。
5.优势:栈区的内存比较小,堆区的内存非常大。
6.在释放内存的时候,在free函数中填的指针,必须要指向内存的首地址。
#include<stdio.h>
#include<stdlib.h>
void main()
{
//赋值的条件:类型相同。
int* p = (int*)malloc(100);//100个字节 头文件是stdlib.h
*p = 10;
*(p + 1) = 20;
printf("%d\t%d\n", *p, *(p + 1));
free(p);//头文件是stdlib.h
int* p1 = (int*)malloc(sizeof(int) * 25);
for (int i = 0; i < 25; i++)
{
*(p1 + i) = i + 1;
}
for (int i = 0; i < 25; i++)
{
printf("%d\t", p1[i]);
}
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
//赋值的条件:类型相同。
int* p = (int*)malloc(100);//100个字节 头文件是stdlib.h
*p = 10;
*(p + 1) = 20;
printf("%d\t%d\n", *p, *(p + 1));
free(p);//头文件是stdlib.h
int* p1 = (int*)malloc(sizeof(int) * 25);
for (int i = 0; i < 25; i++)
{
*(p1 + i) = i + 1;
}
memset(p1, 0, sizeof(int) * 25);//逐字节赋值 头文件是string.h
for (int i = 0; i < 25; i++)
{
printf("%d\t", p1[i]);
}
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
int* p = (int*)malloc(sizeof(int) * 25);
for (int i = 0; i < 25; i++)
{
*(p + i) = i + 1;
}
p = (int*)realloc(p,sizeof(int)*50);//重新分配内存,不会初始化。
for (int i = 0; i < 50; i++)
{
printf("%d\t", p[i]);
}
p = (int*)realloc(p, sizeof(int) * 10);
for (int i = 0; i < 25; i++)
{
printf("%d\t", p[i]);
}
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
int* p = (int*)malloc(sizeof(int) * 25);
for (int i = 0; i < 25; i++)
{
*(p + i) = i + 1;
}
p = (int*)realloc(p, sizeof(int) * 10);
for (int i = 0; i < 25; i++)
{
printf("%d\t", p[i]);
}
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
int* p = (int*)malloc(sizeof(int) * 25);
for (int i = 0; i < 25; i++)
{
*(p + i) = i + 1;
}
p = (int*)realloc(p, sizeof(int) * 10);
for (int i = 0; i < 25; i++)
{
printf("%d\t", p[i]);
}
free(p);
p = NULL;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
int* p = (int*)calloc(25, sizeof(int) * 25);//会默认初始化为0.
for (int i = 0; i < 25; i++)
{
printf("%d\t", p[i]);
}
}
#include<stdio.h>
#include<stdlib.h>
int* fun()
{
//在函数里面申请的堆区内存,不会随着函数的结束而释放,需要手动释放。
int* p = (int*)malloc(sizeof(int));
return p;
}
void main()
{
int* p = fun();
*p = 123;
printf("%d\n", *p);
free(p);
}
#include<stdio.h>
#include<stdlib.h>
int* fun()
{
//在函数里面申请的堆区内存,不会随着函数的结束而释放,需要手动释放。
int* p = (int*)malloc(sizeof(int));
return p;
}
void main()
{
int* p = (int*)malloc(sizeof(int) * 10);
for (int i = 0; i < 10; i++)
{
p[i] = i + 1;
}
int* p1 = (int*)malloc(sizeof(int) * 10 * 2);
for (int i = 0; i < 10; i++)
{
p1[i] = p[i];
}
free(p);
p = p1;
for(int i = 0; i < 20; i++)
{
printf("%d\n",p[i]);
}
}
#include<stdio.h>
#include<stdlib.h>
int* fun()
{
//在函数里面申请的堆区内存,不会随着函数的结束而释放,需要手动释放。
int* p = (int*)malloc(sizeof(int));
return p;
}
void main()
{
int* p = (int*)malloc(sizeof(int) * 10);
for (int i = 0; i < 10; i++)
{
p[i] = i + 1;
}
int* p1 = (int*)malloc(sizeof(int) * 10 * 2);
for (int i = 0; i < 10; i++)
{
p1[i] = p[i];
}
free(p);
p = p1;
for (int i = 0; i < 10; i++)
{
p[i+10]=11 + i;
}
for (int i = 0; i < 20; i++)
{
printf("%d\n", p[i]);
}
free(p);
}
C语言初级阶段7——指针4的更多相关文章
- Swift3.0语言教程使用指针创建和初始化字符串
Swift3.0语言教程使用指针创建和初始化字符串 Swift3.0语言教程使用指针创建和初始化字符串苹果的Swift团队花了不少功夫来支持C的一些基础特性.C语言中为我们提供了指针,Swift也不例 ...
- C语言中的指针数组
C语言中的指针数组是什么,像 char *a[]={"ddd","dsidd","lll"}; 这里讲一下注意如果我们使用了a也就是首元素的 ...
- 【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化
C 语言中的指针和内存泄漏 http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/ 本文讨论了几种在使用动态内存分配时可以避免的陷 ...
- GO语言中的指针
http://www.tizgrape.com/?p=100 Go语言中的指针语法和C++一脉相承,都是用*作为符号,虽然语法上接近,但是实际差异不小. Go使用var定义变量: var v6 *in ...
- 由链表初始化看C语言的二级指针
先来看C语言创建链表.插入节点和遍历链表的一段代码: #include <stdio.h> #include <stdlib.h> typedef int ElemType; ...
- C语言 > 数组和指针
C语言 数组和指针 const: 关于指针和const需要注意一些规则.首先,把const数据或非const数据的地址初始化为指向const的指针或为其赋值是合法的. 然而,只能把非const数据的地 ...
- C语言结构体指针的引用问题
在写栈的一个应用时遇见这样的一个问题 SqStack s; s->base = (int*)malloc(sizeof(int)*10); 通过这样一个代码引用的时候,会导致程序出现异常 经过一 ...
- Go语言基础之指针
区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针. 要搞明白Go语言中的指针需要先知道3个概念:指针地址.指针类型和指针取值. Go语言中的指针 Go语言中的函数传参都是值拷贝 ...
- c语言之函数指针应用
c语言之函数指针应用 1.函数指针与指针函数 在开始运用函数指针前,我们需要将两个概念即:函数指针与指针函数搞清楚. 函数指针,指明这个一个函数,但返回值为指针类型,语法格式为: 类型名* 函数名A( ...
- C语言中的指针笔记
C语言指针 得到变量的地址 可以使用&运算符找到变量保存在内存中的位置 int x = 1; printf("x的内存地址是"%p\n",&x) %p格式 ...
随机推荐
- 小程序使用webview嵌套H5两边如何传参.
需求:项目里面需要进行人脸核身.需要调起小程序的人脸核身功能.需要h5跳转到小程序页面.验证完后回退 1.h5页面先引入一个js文件 2.当用微信小程序的web-view内嵌H5页面的时候,H5页面的 ...
- ELKF搭建
logstash cat /etc/logstash/logstash.yml |grep -v '#'path.data: /data/logstash/datapipeline.ordered: ...
- python方法、类方法和静态方法的区别
class A: def f1(): pass def f2(self): pass @classmethod def f3(cls): pass @staticmethod def f4(): pa ...
- 《Kubernetes零基础快速入门》PDF电子书赠阅
<Python 3.8从入门到精通(视频教学版)> <Kubernetes零基础快速入门> PDF电子书赠阅,个人学习使用,禁止任何形式的商用. https://pan.bai ...
- 瑞士军刀 sox 系列 :给.raw文件添加header变身.wav文件
1.先去安装 sox https://sourceforge.net/projects/sox/files/sox/ 2.将sox的安装目录加到系统path变量里. 3.开始执行命令 sox -t r ...
- php严格模式的使用
<?php declare (strict_types = 1); namespace app\controller; use app\BaseController; use think\fac ...
- 如何利用python的xlrd模块读取日期格式的Excel
经常使用python操作Excel,就会遇到各种坑,比如,有时候你读取到的某一单元格的数据,你预想的结果本来应该是这样的,但是它却是这样的,真是很蛋疼.于是你会找各种解决办法,去解决这个问题!所以鄙人 ...
- HUAWEI——— 防火墙+ACL访问控制+AP上线+默认路由+NAT+DHCP(案例拓扑)
#HUAWEI--- 防火墙+ACL访问控制+AP上线+默认路由+NAT+DHCP(案例拓扑) 网络拓扑图: 项目要求: 1.交换机SwitchA,作为有线终端的网关,同时作为DHCP server, ...
- Linux服务器中了挖矿木马怎么办?-挖矿木马自助清理手册
什么是挖矿木马 挖矿木马会占用CPU进行超频运算,从而占用主机大量的CPU资源,严重影响服务器上的其他应用的正常运行.黑客为了得到更多的算力资源,一般都会对全网进行无差别扫描,同时利用SSH爆破和漏洞 ...
- Java-Excel表数据转List对象->导入数据库
1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.util.ArrayList; 4 import java ...