C语言 字符串数组 二维数组 指针 动态内存分配(2018.11.25)

字符串数组
若字符串数组内内没有‘\0’,用%s输出时,系统会一直找到‘\0’为止。即使超出数组的范围也一直找。

char c[] = “I am happy”; //字符串,长度为11
char c[] = {‘I’, ‘a’, ‘m’, ’ ', ‘h’, ‘a’, ‘p’ ,‘p’, ‘y’}; //字符数组,长度为10
字符串 不等于 字符数组

使用strcat、strcpy,strcmp,strlen,strlur,strupr函数时,需要包含#include<string.h>的头文件

strcat 连接字符串
strcpy 复制字符串
char c1[10] = “abc”;
char c2[10] = “xyz”;
strcpy(c1,c2)
复制后:c1存放:xyz\0

strcmp 比较字符串【比较的不是大小而是每个字符的ACSII码的值】
x = strcmp(c1,c2)
x > 0; c1 > c2
x < 0; c1 < c2
x = 0; c1 = c2

strlen 字符串长度
不包含‘\0’,
eg
char c[10] = “happy”;
strlen©;//长度为5

sizeof()运算符,包含‘\0’,测字节数;
sizeof© ;//值为10

二维数组可放多个字串,列的长度应按最长的计算。
如果字符串赋值给了一个一维数组,一维数组的名字代表首地址。
如果定义时没有赋值内容,以下是错误的。
char a[10]
1, a[10] = “char”;
2, a = “char”;
3, a[9] = “A”【正确的是a[9] = ‘A’】

输入
scanf("%s",c);\一次只能输入不带空格的字符串
需要输入带空格的:gets()
eg:
scanf("%s",c);
how are you?
c中内存存储:how\0

scanf("%s%s%s",c1,c2,c3)
how are you?
c1:how\0
c2:are\0
c3:you!\0

输出。
一个个输出,%c,就像普通数组一样用循环输出。
整体输出,%s, printf("%s",c);//遇到第一个’\0’结束输出。
puts();输出字符串时会把末尾的‘\0’转换成‘\n’
printf(“%s”,c[5]);从第六个开始输出。

指针
直接访问:通过变量地址来访问变量内容。
间接访问:通过指针变量来访问变量内容。

变量指针:地址
指针变量:存放地址的变量

*号没有传递性!
eg
int *p,*i,n;
p,i是指针变量,n是int变量

运算符*与++、–优先级相同,右结合性。

指针变量做函数参数。
int x(int *p)
{}
一般来说是形参决定实参的类型。

一维数组的地址和指针
数组的指针:数组的起始地址
元素的指针:数组元素的起始地址
int p = &a[0];
表示方法:
1、下标法:a[i]
2、指针法:
(a+i) 或者 *(p+i)

*p++与 *(p++)等价,先引用,后加一;
(*p)++:指向的元素值加一

scanf("%d",a+i)
printf("%d",*(a+i))

指向数组的两个指针相减,得到的是相差元素的个数

二维数组地址

a首行地址
a[0], *(a+0), *a0行0列,列地址
a+1,&a[1]第一行首地址,行地址
a[], *(a+1)第一行第0列的元素地址
a[1]+2, *(a+1)+2, &a[1][2]第一行第1列的元素地址
*(a[1]+2), ((a+1)+2), a[1][2]第一行第2列的元素的值

&* , *[];互相抵消

指向指针的指针
printf(“%o\n”,*p);//输出地址
printf("%s\n",*p);//输出字符串

动态数组的实现
静态数据结构,储存空间浪费很大;
动态储存,按需分配;
不用记得释放,不然会出现内存泄漏

malloc()函数
void *malloc(unsigned int size) //以字节为单位
若未能成功执行,则返回空指针(NULL)
eg。long *p;
p = (long *)malloc(8);//返回的是void型指针,需要进行强制转换才能用。

calloc()函数
void *calloc(unsigned int n, size)//size是固定的
分配n个长度为size的连续空间,相当于一维数组。
eg:
long *p;
p = (long *)calloc(5,4);

free()释放空间函数
eg:
long *p;
p = (long *)calloc(5,4);
free(p);

realloc()函数
扩大或缩小原储存空间
eg:
long *p;
p = (long *)calloc(5,4);
p = realloc(p,10);
free(p);

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值