C程序设计笔记6-8章 数组/函数/指针

[ TOP ]

数组

定义 int a[3]={1,2,3}

二维数组

内存中二维数组的排放是线性的
int a[2][3]={{1,3,4},{2,4,6}}

字符数组

字符串即字符数组。
对于定义了长度但没有填满的,在最后补 空字符 \0

以 str 表示 字符数组

字符串处理函数:puts(str),gets(str),strcat(str1,str2),strcpy(str1,str2),strncpy(str1,str2,n),strcmp(str1,str2),strlen(str),strlwr(str),strupr(str)

函数

函数是功能 是方法 是操作 是黑盒子

定义
int test(int x,int y){//函数类型 函数名 形式参数
    return x+y;//函数内容
}

函数若在main下面定义,则在main中使用的时候还需要声明。int test(int x,int y)

嵌套使用

函数中调用其他函数

递归使用

函数中调用本身(需要有中止的条件,否则会无限循环)
经典案例:Hanoi汉诺塔

数组做为参数
局部变量与全局变量
动态存储(局部默认)与静态存储(全局默认)

存储类型:自动(动态)auto,静态static,寄存器register,外部extern
static 变量的赋值仅第一次有效
register将变量的值放入寄存器。实际上编译系统会自动将使用频繁的变量放在寄存器。
extern 声明还未定义的变量(或函数) 引用外部文件或本文件后面定义的变量
在全局变量定义时加static,可以使该变量(或函数)不被外部文件引用(并且不冲突)

指针

指针就是内存地址
一个变量的地址 就叫做这个变量的指针
指针变量是存放地址的变量
int * pointer = &a
因为数组元素是线性排列的,所以数组的指针可以进行计算
数组名代表的是数组首元素的地址
a[i] 与 *(a+i)等同

指针操作多维数组

指针指向1维元素的时候,+1是一个1维元素(包含其2维数据)的内存长度,指向2维元素的时候,+1是一个2维元素的长度
设1维为列,2维为行,指针指向1维时只是列在变化,指向2维时是行在变化(变化大于2维长度就会1维也变化)
PS突然又想到很像数字,10,1维是10的变化,2维是1的变化
因为a[1]==*(a+1);
所以(a+1)+1 != (a+1+1)
(a+1+1)是等于 (a+2)的
假设a数组地址为1000,int字节长度为4,
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

表示printf(“%d”)表示printf(“%d”)
a1000*a1000
a[0]1000*(a+0)1000
&a[0]1000&a[0][0]1000
a[1]1016a+11016
&a[1][0]1016*(a+1)+01016
a[2]1032*(a+2)1032
&a[2]1032a+21032
a[1][0]5
  • (*(a+1)+0)
5
*a[2]9
  • ( *(a+2)+0)
9

指针变量的值可以改变,而数组名不可以

函数指针

定义的函数在编译时,编译系统会给函数代码分配一个存储空间,这个空间的起始地址就是这个函数的指针

int (*p)(int,int);//定义函数指针p
p=max;//指向自定义函数max
c=(*p)(a,b);//调用函数指针p

由于优先级的关系,使用时必须用()把*p括起来

函数指针也可以作为函数参数 (嵌套、递归)
函数返回指针

定义 int *a(int x,int y){};

指针数组

元素均为指针类型的数组就是指针数组
定义一个指向指针数据的指针变量 char **p;//即char * (*p)

指针数组做main的形参

int main(int argc,char * argv[]);
第一个参数是传进来的参数个数,第二个是参数数组

动态内存分配

非静态的变量包括形参分配在内存中的动态存储区,这个区叫做 栈 stack
C语言允许建立内存动态分配区域,这个区域位于一个特别的自由存储区,叫做 堆 heap
动态分配通过系统函数实现,malloc,calloc,free,realloc
1. void * malloc(unsigned int size);
分配一个长度为size的空间,返回该空间起始地址,若失败返回null
2. void * calloc(unsigned n,unsigned size);
分配一个n个长度size的空间。等于malloc(n*size)
3. void free(void * p);
释放空间,p应该是使用malloc或calloc的返回值。无返回值
4. void * realloc(void *p,unsigned int size);
对已经获得的动态空间改变其大小
使用空间时需要进行类型转换(int),C99可以自动转换

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值