一级指针

  • 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语言链表(详解)的更多相关文章

  1. C语言中将二维数组作为函数参数来传递

    c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. 例如: #include <stdio.h> void func(int n, char ...

  2. 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} ...

  3. C语言二维数组作为函数的参数

    前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数.在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示.我写程序的错误如下程序所示: #include < ...

  4. C语言学习笔记 (005) - 二维数组作为函数参数传递剖析

    前言 很多文章不外乎告诉你下面这几种标准的形式,你如果按照它们来用,准没错: //对于一个2行13列int元素的二维数组 //函数f的形参形式 f(int daytab[2][13]) {...} / ...

  5. c语言中如何通过二级指针来操作二维数组

    通过二级指针去访问二维数组需要先给二级指针分配等同于二维数组行数的一维数组指针,然后把二维数组的每行首地址赋值给对应位置的一维指针上.之后就可以通过二维指针直接访问了. 参考代码如下,可以看具体注释辅 ...

  6. C语言中如何将二维数组作为函数的参数传递

    今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不 ...

  7. C++入门经典-例6.11-使用指针变量遍历二维数组

    1:代码如下: // 6.11.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #inc ...

  8. PHP二维数组提取函数----把不需要的数据剔除

    首先说明一些这个函数的应用场景,比如说你得到的数据是个二维数组,里面的很多成员其实是不必要的,比如说api调用后不必要给别人返回一些用不到的垃圾数据吧,如下是代码. <?php /* * del ...

  9. C语言基础:二维数组 分类: iOS学习 c语言基础 2015-06-10 21:42 16人阅读 评论(0) 收藏

    二维数组和一位数组类似. 定义: 数据类型 数组名[行][列]={{ },{ }....}; 定义时,一维(行)的长度可以省略,但是二维(列)的长度不可以省略.但是访问时,一定使用双下标. 二维数组的 ...

随机推荐

  1. vue.js项目nginx部署

    开发环境搭建完成.二.编译部署1.项目路径下demo输入命令npm run build编译完成后会发现在demo文件夹下多出一个dist文件夹这里面就是编译好的文件了.2.网上下载nginx,下载地址 ...

  2. PHP字符串函数之 strcmp strncmp strcasecmp strncasecmp strnatcmp strnatcasecmp

    strcmp – 二进制安全字符串比较 strncmp – 二进制安全比较字符串开头的若干个字符 strcasecmp – 二进制安全比较字符串(不区分大小写) strncasecmp – 二进制安全 ...

  3. 第二十二节:Java语言基础-详细讲解位运算符与流程控制语句

    位运算符(二进制位运算) 运算符 运算 例子 << 左移 3 << 2 = 12 --> 3 * 2 * 2 =12 >> 右移 3 >> 1 = ...

  4. 简单登录注册实现(Java面向对象复习)

    简单登录注册的实现(面向对象的复习) 需求: 设计用户类,包含用户名和密码两个属性 设计LoginDemo类设计用户登录方法 用户有三次登录机会,如果连续三次登录失败则退出程序 功能实现页面:     ...

  5. 使用Go语言访问JSON数据(gojsonq)

    使用Go语言访问JSON数据(gojsonq) 主要是使用第三方的库 gojsonq,来查询JSON数据 例如这样的JSON数据 { "name":"computers& ...

  6. python(leetcode)-350两个数组的交集

    给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5 ...

  7. web自动化测试---selenium分布式测试

    使用selenium框架还可以进行分布式测试,操作如下: 准备俩台PC:A和B,ip分别为IP_A和IP_B 下载最新的selenium-standalone的jar包,可以到下面地址下载各版本的包: ...

  8. Ubuntu 16.04下安装谷歌浏览器(转)

    1.进入 Ubuntu 16.04 桌面,按下 Ctrl + Alt + t 键盘组合键,启动终端. 2.在终端中,输入以下命令,将下载源加入到系统的源列表. sudo wget http://www ...

  9. SpringBoot之OAuth2.0学习之客户端快速上手

    2.1.@EnableOAuth2Sso 这个注解是为了开启OAuth2.0的sso功能,如果我们配置了WebSecurityConfigurerAdapter,它通过添加身份验证过滤器和身份验证(e ...

  10. 理解Array.prototype.fill和Array.from

    之所以将这两个方法放在一起说,是因为经常写这样的代码: Array.from({length: 5}).fill(0),看起来很简洁,但是踩到坑之后才发现自己对这两个方法实在是不求甚解. Array. ...