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) 收藏
二维数组和一位数组类似. 定义: 数据类型 数组名[行][列]={{ },{ }....}; 定义时,一维(行)的长度可以省略,但是二维(列)的长度不可以省略.但是访问时,一定使用双下标. 二维数组的 ...
随机推荐
- 基于UML的公开招聘教师管理系统建模的研究和设计
一.基本信息 标题:基于UML的公开招聘教师管理系统建模的研究和设计 时间:2018 出版源:赤峰学院学报(自然科学版) 领域分类:UML:公开招聘教师系统:面向对象方法:建模. 二.研究背景 问题定 ...
- Django——用户认证和判断用户是否登录
用户认证 必须通过认证之后才能login(request,user)这样才能保存会话到request中,注销后会话结束 注意 自定义的用户登陆时只不止需要验证用户名和密码的需要写认证,就例如在线教育平 ...
- 冲刺博客NO.8
今天做了什么: 多天学习后,实现了短信验证的功能,可以选择国家,可以在Mob的后台管理短信验证 遇到的困难: 注册回调事件,afterEvent的判定(事件完成后调用)
- hadoop2.4.0伪分布式搭建以及分布式关机重启后datanode没起来的解决办法
1.准备Linux环境 1.0点击VMware快捷方式,右键打开文件所在位置 -> 双击vmnetcfg.exe -> VMnet1 host-only ->修改subnet ip ...
- Learning WCF:A Simple Demo
This is a very simple demo which can help you create a wcf applition quickly. Create a Solution Open ...
- Ubuntu 16.04虚拟机调整窗口大小自适应Windows 7
Windows 7上Ubuntu 16.04虚拟机安装成功后,默认的虚拟机窗口比较小,需要适当调整,才能把虚拟机的屏幕放大, 适合使用,以下介绍调整方法. 安装VMware Tools 启动虚拟机, ...
- Linux pwn入门教程(6)——格式化字符串漏洞
作者:Tangerine@SAINTSEC 0x00 printf函数中的漏洞 printf函数族是一个在C编程中比较常用的函数族.通常来说,我们会使用printf([格式化字符串],参数)的形式来进 ...
- 14:IO之字符字节流
字节流: InputStream OutputStream 字节流: FileInputStream FileOutputStream BufferedInputStream Buffer ...
- Swift5 语言指南(十二) 属性
属性将值与特定类,结构或枚举相关联.存储的属性将常量和变量值存储为实例的一部分,而计算属性则计算(而不是存储)值.计算属性由类,结构和枚举提供.存储的属性仅由类和结构提供. 存储和计算属性通常与特定类 ...
- Spring,为内部方法新起一个事务,此处应有坑。
事务的作用,使我们操作能够连贯起来.而spring则是提供了一个更简单的方法,只要使用 @Transactional 一个注解,就可以保证操作的连贯性了. 普通用法,稍后再说,这里要说的是: 在最外面 ...