C专家编程---(六)

一、数组与指针相同情景

1.数组从声明和使用来解释

(1)声明:
a.extern,如extern char a[ ];不能改写成指针形式
b.定义,如char a[10];不能写成指针的形式
c.函数的参数,如func(char a[ ] );可以选择数组或指针形式

(2)表达式:
如 c = a[i]; 可以选择数组或指针形式

2.两者相同的C语言标准的规则如下:
(1)规则1:表达式中的数组名就是指针

a.在表达式中,数组和指针是可以互换的,因为它们在编译器中都是指针,都可以取下标操作
eg:a[6] 与 6[a] 都是等价的

(2)规则2:C语言吧数组下标作为指针的偏移量

a.无论是指针还是数组,在连续的内存地址上移动时,编译器都必须计算每次前进的步长。计算方法就是偏移量乘以每个数组元素所占的字节数,结算结果就是偏移数组起始地址的实际字节数。

(3)规则3:作为函数参数的数组名等同于指针

a.编译器只向函数传递数组的地址,而不是整个数组拷贝

func(int *i){}
func(int i[]){}
func(int i[2000]){}
//都是合法的

b.之所以只要做是为了效率问题:

C语言中,所有非数组形式的数据实参都以传值形式调用(对实参做一份拷贝并传递给调用函数,但函数不能改变其实参的实际变量的值,而只能改变拷贝的那份),如果要拷贝整个数组,空间和内存上都是很大的开销的!

c.在函数内部使用指针,所能进行对数组的操作几乎和传递原本的数组没有区别,但是用sizeof来获得数组的长度的话,所得的结果将会不正确!

d.修改它的值只能在指针进行,数组不可以,因为数组名是不可修改的左值,它的值永远不能改变!!

e.数组参数的地址和数组参数的第一个元素的地址是不一样的!!

二、多维数组

1.初始化问题
a.一维数组可以把初始化都放在一对花括号内来完成初始化,多维数组可以通过嵌套的花括号来进行初始化;

int a[]={1,2,3,4};
int b[][3]={{1,2,3},{4,5,6}}

b.只能够在数组声明是对它进行整体的初始化!

c.数组长度比所提供的初始化值的个数要多是,剩余几个元素会被设置成0!

d.只有字符串常量才能初始化指针数组,非字符串的类型不能直接初始化指针数组

char *a[] = {
    "you",
    "are",
    "good",
};//合法的
*******************
int *b[] = {
    {1,2,4,5},
    {6,7,8,9},
};//非法的

第十章------再论指针

1.多维数组内存形式,例如是二维数组 a[1][2]

假想:就是一个矩阵
实际内存:是以线性排列在内存中的
编译器:会编译成*(*(a+i)+j)

2.指针数组:

(1)char *b[20] 把 b 声明为一个具有20个元素的数组,元素类型是指向字符的指针;
char (*b)[20]才算是真正声明一个指向字符串的指针数组!

(2)指针数组必须用指向字符串而分配的内存的指针进行初始化

//a---->可以用一个常量初始化值
//b---->可以用以下循环初始化
for(j = 0 ; j <= 4 ; j++)
    a[j] = malloc(6);
//c--->用malloc分配整个x * y 个数据的数组,然后用一个循环,使用指针
//指向这块内存的各个区域
malloc(row_sixe * column_size * sizeof(char));    

3.锯齿状数组
含义:声明一个字符串指针数组,并根据需要为这些字符分配内存,因为右端长度不一,所以称为锯齿状数组。
创建方法:

char *t[N];
char my_string[] = "you are good";
//方法一:共享字符串
t[i] = &my_string[0];
//方法二:拷贝字符串
t[i] = malloc(strlen(my_string)+1);
strcpy(t[j],my_string);


4.向函数传递一个数组

(1)一维数组(一个约定):

a.增加一个额外的参数,表示元素的数目
b.赋予数组最后一个元素一个特殊的值,提示它是数组的尾部

(2)二维数组(两个约定):

数组被改写成指向数组第一行的指针,一个用于提示每行的结束;
一个用于提示所有行的结束,也可以增加一行让所有元素值都是不能正常出现的,或者定义多另一个参数,也就是数组的行数。

5.使用指针向函数传递一个多维数组

最好办法:放弃传递二维数组,把array[x][y]改写成一个一维数组array[x+1],元素类型是指向array[y]的指针,最后在array[x+1]里存储一个NULL指针表示数组结束

6.动态数组
使用malloc()来分配得到一个指向一大块内存的指针,然后向引用数组一个引用这块内存,其机理就是一个数组下标访问可以改写为一个指针加上偏移量。

realloc()能够对一个现在的内存大小进行重新分配,并且不会丢失原先内存块内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值