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) 收藏
二维数组和一位数组类似. 定义: 数据类型 数组名[行][列]={{ },{ }....}; 定义时,一维(行)的长度可以省略,但是二维(列)的长度不可以省略.但是访问时,一定使用双下标. 二维数组的 ...
随机推荐
- [solution] JZOJ-5795 词典
[solution]JZOJ-5795 词典 题面 Description 小C有$n$个字符串$T_1 T_n$,给出$m$个询问 第$i$个询问给出一个字符串$S_i$,对于每个询问,我们可以得到 ...
- 跨域访问问题js
您可以通过使用JSONP形式的回调函数来加载其他网域的JSON数据 访问百度的地址解析 返回来省,地区,市 $.getJSON("http://api.map.baidu.com/clou ...
- Docker构建文件
构建文件 创建Dockerfile touch Dockerfile 编辑Dockerfile vim Dockerfile #基于java8版本构建 FROM java:8 #挂载日志目录 VOLU ...
- Xcode8.0 / OS X EI Capitan 10.11.6 提交报错90111
改用新系统和新版xcode(都是正式版)后,提交App Store审核时报错: INFO ITMS-90111: "Beta Toolchain. 构建新的 App 和App 更新时,必须使 ...
- Go Code Review Comments 译文(截止2018年7月27日)
持续更新中- 原文最新链接 https://github.com/golang/go/wiki/CodeReviewComments/5a40ba36d388ff1b8b2dd4c1c3fe820b8 ...
- Flask实例化的参数 及 对app的配置
首先展示一下: from flask import Flask app = Flask(__name__) # type:Flask app.config["DEBUG"] = T ...
- 选项卡--原生js
比较基础的一个特效,毕业设计要做一些记录,就把这些都记下来吧,万一用到的时候忘了呢 function changeTab() { let navs = document.getElementsByTa ...
- Spring事务管理(详解+实例)
1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是 ...
- Shell-14--awk
awk ' 条件1{ 动作1} 条件2{动作2}...' 文件名 awk处理数据是 先读取第一行 然后再去处理 printf 不会加入换行符,需要手动加入 print 会自动加换行 begin 是在后 ...
- Liferay7 BPM门户开发之5: Activiti和Spring集成
参考文档: https://github.com/jbarrez/spring-boot-with-activiti-examplehttps://github.com/sxyx2008/spring ...