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) 收藏
二维数组和一位数组类似. 定义: 数据类型 数组名[行][列]={{ },{ }....}; 定义时,一维(行)的长度可以省略,但是二维(列)的长度不可以省略.但是访问时,一定使用双下标. 二维数组的 ...
随机推荐
- 使用freemarker对模板进行渲染
最近项目中使用到了,对word模板进行编辑和渲染,所以使用到了模板引擎技术. 在项目中,我们前端使用的富文本编辑器,进行展示和保存(和word格式一致),后端采用了freemarker进行数据的渲染. ...
- Kotlin 开篇
Kotlin 是一个基于 JVM 的新的编程语言,由 JetBrains 开发官网地址:http://kotlinlang.org.JetBrains,作为目前广受欢迎的 Java IDE Intel ...
- Linux(以RHEL7为例)下添加工作区的方法|| The Way To Add Workspace On Linux
Linux(以RHEL7为例)下添加工作区的方法 The Way To Add Workspace On Linux 作者:钟凤山(子敬叔叔) 编写时间:2017年5月11日星期四 需求:有时候在使用 ...
- postgresql vacuum操作
postgresql vacuum操作 PostgreSQL数据库管理工作中,定期vacuum是一个重要的工作.vacuum的效果: 1.1释放,再利用 更新/删除的行所占据的磁盘空间. 1.2更新P ...
- C++ lamba使用
Moderm Effective C++ 条款31 第206提到了按引用捕获局部变量和函数形参时,如果lambda式的生命期依赖于局部变量和函数形参的生命期,需注意空悬引用的问题. 原书的例子不够直观 ...
- vue keep-alive解决关闭标签动态缓存问题
直接上代码: <keep-alive :include='topNavMentNames'> <router-view ></router-view> </k ...
- zookeeper常用指令
zk服务 bin 目录下常用的脚本解释 zkCleanup 清理 Zookeeper 历史数据,包括日志文件和快照数据文件 zkCli Zookeeper 的一个简易客户端 zkEnv 设置 Zook ...
- Shell - 文本处理
珠玉在前,不再赘言. 常用命令 LinuxShell文本处理工具集锦 数据工程师常用的Shell命令 文件和目录管理 简明教程 AWK简明教程 SED简明教程 命令详解 linux sort,uniq ...
- iOS开发笔记(Swift)-针对Swift调用PPiFlatSegmentedControl项目的一些修改
PPiFlatSegmentedControl项目是一个很流行的开源iOS控件库,提供了扁平化风格(Flat style)的SegmentedControl,可以自定义segment的颜色,图标.大小 ...
- 阿里P9架构师讲解从单机至亿级流量大型网站系统架构的演进过程
阶段一.单机构建网站 网站的初期,我们经常会在单机上跑我们所有的程序和软件.此时我们使用一个容器,如tomcat.jetty.jboos,然后直接使用JSP/servlet技术,或者使用一些开源的框架 ...