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格式 ...
随机推荐
- Keil51单片机数码管鬼影显示问题
Keil51单片机数码管鬼影显示问题 所为的鬼影就是程序逻辑正确,但电路逻辑有问题.就是按程序逻辑,前一个数字显示后,直接显示下一组数字,因为没清干净,导致瞬间残留: 处理的办法,就是有就显示,没有就 ...
- 安装使用反编译工具ILSPY
一.ILSPY简介1.1.ILSPY介绍 ILSPY是一款开源.免费的.且适用于.NET平台反编译[C#语言编写的程序和库(.dll)内容]工具:可以集成在Visual Studio 开发工具中,能够 ...
- 为什么 A 能 ping 通 B,B 却不能 ping 通 A ?
有开发小哥咨询了一个问题,记录一下处理过程分享给有需要的朋友. 问题如下: A.B 两台开发服务器连接交换机,并且 A.B 两台服务器的 IP 地址设置为同一个网段,却发现 A 能 ping 通 B ...
- debug 获取mybatis dao 连接的数据库
MapperProxy.invoke MapperMethod.execute 查看sqlSession .
- Linux进程调度算法
进程的状态 进程的基本状态 就绪:进程已获得除处理机以外的所需资源,等待分配处理机资源 执行:进程正在占用处理机资源执行 阻塞:进程等待某种条件,在条件满足之前无法执行.例如发起I/O系统调用,等待I ...
- Cascader 级联选择器 数据不回显
这次的问题原因主要是因为 数据存在于两张表 并且索引的字段不同 一个为id(int)一个为字符(string) 在做修改操作数据回显的时候会导致 后端返回的数组中一个为字符一个为bumber ...
- Jenkins多节点python环境隔离(Windows)
Jenkins多节点python环境隔离(Windows) 使用Jenkins构建过程中,需要使用多个Jenkins节点并发构建 由于条件限制,只有一台Windows宿主机,所以在这台宿主机上部署多个 ...
- Linux一键单机部署和集群部署
整个部署脚本只用执行sh即可,有需要可以联系我. 一.部署类型 可参考:常见的部署类型(停机部署.蓝绿部署.滚动部署.灰度部署.AB测试等) 二.一键单机部署Docker服务 三.一键单机部署原生服务 ...
- (jmeter笔记)聚合报告分析
Label:说明是请求类型,如Http, FTP等请求. #Samples:也就是图形报表中的样本数目,总共发送到服务器的样本数目. Average:也就是图形报表中的平均值,是总运行时间除以发送到服 ...
- jadx 定位方法
目录 链接参数定位 链接参数定位 通过搜索请求链接中的参数来定位函数位置,如下图所示,请求链接为 https://www.python-spider.com/api/app1,app1为链接标识,可以 ...