C语言 数组指针,指针数组

作业

作业1 不同维数数组和指针数组的传参

  1 #include <stdio.h>
  2 
  3 void  print1(char *ptr)
  4 {
  5     printf("ptr = %s\n",ptr);
  6 }
  7 void print2(char (*ktr)[100])
  8 {
  9     int i=0;
 10     for(i=0;i<2;i++)
 11     {
 12         printf("ktr[%d] = %s\n",i,*(ktr+i));
 13     }
 14 }
 15 void print3(char (*str)[2][100])
 16 {
 17     int i=0;
 18     int j=0;
 19     for(i=0;i<2;i++)
 20     {
 21         for(j=0;j<2;j++)
 22         {
 23             printf("str[%d][%d] = %s \n",i,j,*(*(str+i)+j));
  24         }
 25     }
 26 }
 27 void print4(char **ytr)
 28 {
 29     int i=0;
 30     for(i=0;i<3;i++)
 31     {
 32         printf("ytr[%d] = %s \n",i,*(ytr+i));
 33     }
 34 }
 35 
 36 int main()
 37 {
 38     char ptr[100]="hello";
 39     char ktr[2][100]={"hello1","hello2"};
 40     char str[2][2][100]={{"hello3","hello4"},{"hello5","hello6"}};
 41     char *ytr[3]={"hi1","hi2","hi3"}; //pointer array
 42 
 43     print1(ptr);
 44     print2(ktr);
 45     print3(str);
 46     print4(ytr);
 47     return 0;
 48 }

结果

[root@localhost 0708]# gcc zuoye.c
[root@localhost 0708]# ./a.out
ptr = hello
ktr[0] = hello1
ktr[1] = hello2
str[0][0] = hello3 
str[0][1] = hello4 
str[1][0] = hello5 
str[1][1] = hello6 
ytr[0] = hi1 
ytr[1] = hi2 
ytr[2] = hi3 

作业2 单链表复习

  • 链表中的数据是以结点来表示的,每个结点的构成:元素+ 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。单链表是链式存取的结构。
  • 单链表中每个结点的存储地址是存放在其前趋结点next域中,而开始结点无前趋,故应设头指针head指向开始结点。链表由头指针唯一确定,单链表可以用头指针的名字来命名。
    终端结点无后继,故终端结点的指针域为空,即NULL。

课堂笔记

1.位运算 & | ^ >> << ~

按位与运算对某些位清零或保留某些位 清零与0 保留与1 置位或1 异或取反(同为0,异为1)特定为1

  • demo1:输入一个整数 将其转化为32位二进制的表现形式:
    在这里插入图片描述
  • demo2:输入十进制 转化为十六进制
    在这里插入图片描述
2.编译预处理
  • 宏变量
    #define MAX 13 提高代码可读性

  • 宏函数 #define MAX(a,b) (a) > (b) ? (a) : (b):

  • 宏函数和自定义函数的区别:
    宏函数:傻瓜式替换 省去函数调用返回的时间,同样省去了给形参分配空间和释放。用编译时间换内存空间和运行时间

  • 什么时候用宏函数?:频繁使用并且功能短小简单的函数

  • 条件编译
    如果重复定义:
    法一
    #ifndef __ FUNC_H __
    #define __ FUNC_H __
    ………………
    #endif
    法二
    #pragma once
    #include “func.h”
    Int b=5;

3. 编码规范
  • 无关块之间空行
  • 四格缩进
  • 一行一个变量
  • for while 不管多少行都加{ }
  • 变量和赋值之间加空格
4.指针
  • 指针是什么?是一个变量,保存的是地址,作用:能够直接操作地址(访问硬件)
  • 指针类型是根据存储的地址的类型(类型+步长)
  • Int *p =&n;p+1 %p取地址 跳4个字节 char 跳一个字节 %x 十六进制
  • **是取值运算符 &取地址运算符
  • 多维指针作用:保存前一维指针变量的地址
  • 指针赋值一定是相同类型
  • -万能指针 void* :可以接受任何类型指针的值,不能做取值和运算 自加跳一个字节
  • 指针-指针?等于之间有多少个此类型的数据
  • 野指针:没有给指针赋值时,会随机给他一个地址,现在新版置为空(零地址),不能直接对他操作 所以应该先分配个空间
    ptr = char(*)malloc(sizeof((char)*100)
    if(ptr ==NULL)
    {
    exit(1);//加个判断
    }
    free(ptr)
    ptr=NULL //务必置为空 可能内存泄漏
5.数组
  • 一维数组名是指针常量保存数组首元素的地址
  • 数组地址:对数组名取地址获得的是整个数组的地址
  • *(&a)=a
    对一维数组的地址取值等于一维数组首元素的地址
  • 数组指针 int (*p)[max] =&a;
  • 二维数组名:指针常量 保存一维数组地址
  • 一维数组单位是元素,二维数组单位是一维数组
  • 指针数组 int *p[3];
    int main (int argc ,char *argv[])
    {
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值