C-指针,二级指针,二维数组作为函数参数使用,C语言链表(详解)
一级指针
- int *p; //表示定义一个int型(4字节)的指针p
- &p //表示p自身的地址位置
- p //表示p指向的地址位置(也就是p变量的值)
- *p //表示p指向的地址里面的内容
所以 * 的作用: p变量的值作为地址,去访问这个地址的内容
二级指针
- int **pp //表示定义一个int *型的指针pp
- &pp //表示pp自身的地址位置
- pp //表示pp指向的地址, 比如pp=&p,注意pp是int *x型,所以指向其它类型地址将会报错,
- *pp //表示pp指向的地址上的内容, 比如pp=&p,则*pp将去访问&p地址的内容.
- **pp //表示将pp指向的地址上的内容作为地址,去访问这个地址的内容, *pp=*(*pp)=*p
例如:
int main()
{
int i=; //假设 &i =0x100
int *p=&i; //假设 &p =0x500
int **pp=&p; //假设 &pp=0x1000 /*
所以 &i=0x100,i=5
&p=0x500 p =0x100 *p=5
&pp=0x1000 pp=0x500 *pp=0x100 **pp=5
*/
}
二级指针与二维数组使用参考:https://blog.csdn.net/fengxinlinux/article/details/51541003
如果想将二维数组作为函数参数使用,可以这样写:
#include <stdio.h> void func(int arrs[][])
{
arrs[][]=;
} int main()
{
int arrs[][];
func(arrs);
printf("arrs[0][2]=%d\n",arrs[][]);
return ;
}
链表
首先讲讲malloc和free:
在添加链表和释放链表时需要用到,避免内容被自动释放
void *malloc(int size);
malloc返回值是void *类型,所以需要用指针获取,且还需要强制转换.
void free(void *ptr);
释放地址,和malloc搭配使用,例如:
char *p; char str[]="ABCD"; p= (char *)malloc(strlen(str)); //必须使用指针获取,并强制转换 strcpy(p,str); ... ... free(p);
双向链表实例如下:
#include "stdio.h"
#include <stdlib.h>
#include "string.h" typedef struct NAME{
char *name;
struct NAME *preced; //上个name链表成员
struct NAME *next; //下个name链表成员
}T_NAME, *PT_NAME; PT_NAME g_ptNameListHead=NULL; //链表头 void add_LinkList(PT_NAME nameNew)
{
PT_NAME ptTamp;
int i=;
if(g_ptNameListHead==NULL) //第一次添加链表
{
g_ptNameListHead= nameNew;
return ;
} else
{
ptTamp=g_ptNameListHead; while(ptTamp->next) //下个链表成员是否为空
{
ptTamp=ptTamp->next;
} ptTamp->next=nameNew; //添加下个链表成员 nameNew-> preced= ptTamp; //在下个链表成员里添加上个链表 return ;
}
} void add_name(char str[])
{
PT_NAME ptTamp;
char *p; p=(char *)malloc(strlen(str)); strcpy(p,str); ptTamp=(PT_NAME)malloc(sizeof(T_NAME)); ptTamp->name=p; ptTamp-> preced=NULL; ptTamp-> next= NULL; add_LinkList(ptTamp); //添加链表
} /*从链表里找到name位置*/
PT_NAME find_name(char str[])
{
PT_NAME ptTamp;
if(g_ptNameListHead==NULL)
return NULL;
ptTamp=g_ptNameListHead;
while(ptTamp)
{
if(strcmp(ptTamp->name,str)==) //find
{
return ptTamp;
}
else
ptTamp=ptTamp->next;
}
return NULL; } int del_name(char str[])
{
PT_NAME ptTamp;
PT_NAME ptLast;
PT_NAME ptNext;
ptTamp=find_name(str);
if(!ptTamp)
return -; if(ptTamp==g_ptNameListHead) //若去掉的是链表头
{
g_ptNameListHead=ptTamp->next; //指向下个链表成员
}
else
{
/*获取上个链表成员和下个链表成员*/
ptLast=ptTamp->preced;
ptNext=ptTamp->next ; /*去掉当前链表成员*/
ptLast->next= ptNext;
ptNext->preced=ptLast;
} free(ptTamp->name);
free(ptTamp);
return ;
} void List_name(void)
{
int i=;
PT_NAME ptTamp=g_ptNameListHead; while(ptTamp)
{
printf("<%d> %s\n",i,ptTamp->name);
ptTamp=ptTamp->next;
i++;
}
} void scanf_name(char cmd)
{
char name[];
switch(cmd)
{
case 'a': //add
{
printf("please enter name:\n");
scanf("%s",name);
add_name(name);
printf("add %s OK\n",name);
break;
}
case 'd': //del
{
printf("please enter name:\n");
scanf("%s",name);
if(del_name(name)<)
{
printf("del %s error\n",name);
}
else
printf("del %s OK\n",name);
break;
}
case 'l': //list
List_name(); break;
}
} int main(int argc, char **argv)
{
char c; while()
{
printf("**********************\n");
printf("<l> List all the names\n");
printf("<a> add one name\n");
printf("<d> del one name\n");
printf("<q> quit\n");
printf("**********************\n"); do{
scanf("%c",&c);
}while(c!='a'&&c!='d'&&c!='q'&&c!='l'); switch(c)
{
case 'a':
case 'l':
case 'd':scanf_name(c); break; case 'q':return ; default : break;
}
}
}
运行打印:


C-指针,二级指针,二维数组作为函数参数使用,C语言链表(详解)的更多相关文章
- C语言中将二维数组作为函数参数来传递
c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. 例如: #include <stdio.h> void func(int n, char ...
- C语言二维数组作为函数参数
设有整型二维数组a[3][4]如下:0 1 2 34 5 6 78 9 10 11 它的定义为: int a[3][4]={{0,1,2,3},{4,5,6,7} ...
- C语言二维数组作为函数的参数
前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数.在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示.我写程序的错误如下程序所示: #include < ...
- C语言学习笔记 (005) - 二维数组作为函数参数传递剖析
前言 很多文章不外乎告诉你下面这几种标准的形式,你如果按照它们来用,准没错: //对于一个2行13列int元素的二维数组 //函数f的形参形式 f(int daytab[2][13]) {...} / ...
- c语言中如何通过二级指针来操作二维数组
通过二级指针去访问二维数组需要先给二级指针分配等同于二维数组行数的一维数组指针,然后把二维数组的每行首地址赋值给对应位置的一维指针上.之后就可以通过二维指针直接访问了. 参考代码如下,可以看具体注释辅 ...
- C语言中如何将二维数组作为函数的参数传递
今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不 ...
- C++入门经典-例6.11-使用指针变量遍历二维数组
1:代码如下: // 6.11.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #inc ...
- PHP二维数组提取函数----把不需要的数据剔除
首先说明一些这个函数的应用场景,比如说你得到的数据是个二维数组,里面的很多成员其实是不必要的,比如说api调用后不必要给别人返回一些用不到的垃圾数据吧,如下是代码. <?php /* * del ...
- C语言基础:二维数组 分类: iOS学习 c语言基础 2015-06-10 21:42 16人阅读 评论(0) 收藏
二维数组和一位数组类似. 定义: 数据类型 数组名[行][列]={{ },{ }....}; 定义时,一维(行)的长度可以省略,但是二维(列)的长度不可以省略.但是访问时,一定使用双下标. 二维数组的 ...
随机推荐
- Shell脚本学习-数组
跟着RUNOOB网站的教程学习的笔记 Shell数组 数组中可以存放多个值,Bash Shell只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与PHP类似). 与大部分编程语言类似,数 ...
- 理解React组件的生命周期
本文作者写作的时间较早,所以里面会出现很多的旧版ES5的时代的方法.不过,虽然如此并不影响读者理解组件的生命周期.反而是作者分为几种不同的触发机制来解释生命周期的各个方法,让读者更加容易理解涉及到的概 ...
- Beta冲刺 (3/7)
Part.1 开篇 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Part.2 成员汇报 组员1(组长)柯奇豪 过去两天完成了哪些任务 熟悉并编写小程序的自定义控件 编辑文 ...
- python20分钟入门
原子类型 # 内建函数名不可以做变量名如sum,ord abs(-1) # 1 d = dict() # d = {}空字典的构造 l = list() # l = [] s = set(list) ...
- 程序的流程控制-分支结构 if
1.分支结构:if语句 第一种格式: /* if(条件表达式){ 语句体; } 其它语句 */ public class IfDemo1{ public static void main(String ...
- 171. Excel表列序号
题目:给定一个Excel表格中的列名称,返回其相应的列序号. 例如, A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> ...
- MyBatis 源码分析 - 缓存原理
1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力.作为一个重要的组件,MyBatis 自然 ...
- Bootstrap框架的基本使用
Bootstrap是什么 简介 就是已经写好的一个html和css的样式组合 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应 ...
- Android OpenGL ES 开发(N): OpenGL ES 2.0 机型兼容问题整理
在使用OpenGL ES做开发的时候,发现不是所有机型对OpenGL的代码都兼容的那么好,同样的代码在某些机型上总是会出现问题,但是在其他手机上就是好的.下面是本人总结的OpengGL 兼容问题: 一 ...
- [CocoaPods]客户端加载第三方库
请先阅读另一篇博文铺垫知识基础:[CocoaPods]终端方式集成第三方库 客户端的Github地址:CocoaPods-app 点击下载客户端: [CocoaPods客户端] 安装下载的文件.软件界 ...