一级指针

  • 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=5;           //假设  &i =0x100int *p=&i;         //假设  &p =0x500int **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[][2])
{arrs[0][2]=100;
}int main()
{int arrs[8][2];func(arrs);printf("arrs[0][2]=%d\n",arrs[0][2]);return 0;
}

链表

首先讲讲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=0;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)==0)             //find{return  ptTamp;}elseptTamp=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 -1;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 0;
}void List_name(void)
{int i=0;PT_NAME ptTamp=g_ptNameListHead;while(ptTamp){printf("<%d> %s\n",i,ptTamp->name);        ptTamp=ptTamp->next;}
}void  scanf_name(char cmd)
{char name[128];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)<0){printf("del %s error\n",name);}elseprintf("del %s OK\n",name);     break;}case 'l':                //listList_name(); break;}
}int main(int argc, char **argv)
{char c;while(1){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 0;default : break;}}
}

C-指针,二级指针,二维数组作为函数参数使用,C语言链表(详解)相关推荐

  1. C语言 二维数组作为函数参数的4种方式

    前言 多维数组中,二维数组是最常用的一种.在C语言编程中,二维数组的定义.取值以及赋值都比较容易,与一维数组类似.然而,在将二维数组作为函数参数传递时,参数结构较复杂,难以理解.本文章是实用型文章,注 ...

  2. 二维数组作为函数参数传递剖析(C语言)

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

  3. c/c++ 一维数组、二维数组作为函数参数、返回值

    c/c++ 一维数组.二维数组作为函数参数.返回值 一.一维数组作为参数 传入数组 int [] 为了规范,常常需要将数组的size一同传入,这是因为C++/C遇到参数为数组时,不会去一个个拷贝数组内 ...

  4. 在C++中如何将二维数组作为函数参数

    一直以来弄不清C++中数组怎么作为参数传入函数中,尤其是最近学了Python之后,Python这种几乎可以把一切作为参数传入函数的方式更是让我在C++中混淆,下面来总结一下二维数组作为函数参数该如何表 ...

  5. C语言 | 二维数组作为函数参数

    1024G 嵌入式资源大放送!包括但不限于C/C++.单片机.Linux等.关注微信公众号[嵌入式大杂烩],回复1024,即可免费获取! 偶然间发现C语言二维数组作为函数的参数是个比较容易出错的问题. ...

  6. C++二维数组做函数参数

    C++二维数组做函数参数 二维数组做函数参数的形式主要有: /对于一个m行n列int元素的二维数组 //函数f的形参形式 f(int daytab[m][n]) {...}//以下两种可以忽略行数 f ...

  7. 用二维数组作为函数参数,编程计算并输出n×n阶矩阵的转置矩阵。

    按如下函数原型,用二维数组作为函数参数,编程计算并输出n×n阶矩阵的转置矩阵. 其中,n由用户从键盘输入.已知n值不超过10. void Transpose(int a[][N], int n); v ...

  8. 二维数组作为函数参数的用法(c++)

    背景 今天刷题的时候遇到了需要一个大小可变的二维数组作为函数参数进行传递的情况,有点模糊不清,所以查了一些资料,写了这篇博客. 大小固定的二维数组 正确写法如下: void Func(int arra ...

  9. 如何将二维数组作为函数参数

    1.函数声明: 将二维数组作为函数参数的函数声明有两种 二维数组型:如 int sum(int ar2[][size]);注意:行数可不声明,但要求列数必须要声明,不然将发生错误! 指针型:如 int ...

最新文章

  1. 如何高效的管理团队?提高组织能力是关键!
  2. ORM映射框架总结--数据操作(五)
  3. Access数据库审计工具mdbtools
  4. centos7 kickstart 使用小结
  5. ASP.NET项目中的驼峰格式JSON响应
  6. 学术论文参考文献书写规范
  7. 微信活动报名源码php,fb1357 Thinkphp活动报名发布微信小程序源码 聚会活动报名小程序含说明...
  8. 信息安全实验三 :PGP邮件加密软件的使用
  9. 无线AP,无线中继器与无线路由
  10. 信了你的邪之杭电1005
  11. CVPR2022目标检测文章汇总+创新点简要分析
  12. 给人脸戴上口罩,Python实战项目来了
  13. 3个老鼠确定8个瓶子哪瓶有毒
  14. 《商业2.0》评最佳非美国Web2.0 中国3家入选
  15. abaqus linux命令,linux下安装abaqus
  16. 2016年8月18日 星期四 --出埃及记 Exodus 16:19
  17. transparent(指定透明度)使用方法
  18. 利用keil完成ARM汇编语言编程入门实践
  19. HTML5期末大作业:橙色精美零食网站设计——橙色精美零食(3页) web前端课程设计_web前端课程设计代码,web课程设计-HTML网页制作代码
  20. 前端自动化工作流_当每项工作都自动化时

热门文章

  1. 算法题26 复杂链表的复制
  2. 分页数据的新展示方式---瀑布流
  3. “机器换人”没什么可抱怨
  4. 快速上手笔记,PyTorch模型训练实用教程(附代码)
  5. pandas matplotlib 直播数据分析
  6. java项目性能测试过程记录
  7. 基于高德地图的描点操作,监听地图缩放,展示合理数量的marker
  8. BZOJ1257 [CQOI2007]余数之和
  9. android studio 打开github开源代码
  10. 7月第4周全球域名商(国际域名)新增注册量TOP15