(C)数组,指针

数组:

int *a[8];指针数组,每个单元存放一个指针。每个指针是占8个字节在64位,32位占4个字节。

int(*a)[8]:数组指针,一个指向数组的指针。

数组定义:由若干个相同类型的相关数据项按顺序存储在一起,构成数组(array) ;数组实际上是同种类型、有序的数据的集合。同一数组中的元素必须具有相同的数据类型,而且这组数据在内存中将占据一段连续的存储单元。

下标值n表示为所在维的数组元素个数,该维的数组下标的上界是n-1;C语言中数组下标下界始终为0。维数是下标的个数。

1.数组名后使用方括号括起来的常数表达式,不能用圆括号。 int  a(10); ×

2.常数表达式表示元素的个数,即数组长度,而不是数组的上界。

3.常数表达式中可以包括常量和符号常量,不能包括变量。如变长数组:不能用输入的数字定义数组的长度。

4.数组必须先定义,然后使用。

5.一维数组元素在内存中的排列顺序是线性排列即连续存储的。

数组的初始化

1.在对全部数组元素赋初值时,可以不指定数组长度。

int  a[5]={1,  2,  3,  4,  5}        可以写成:int a[ ]={1,2,3,4,5}

2.当数组被说明为静态(static)存储类型或外部存储类型(即在所有函数外部定义)时,则在不显式给出初值的情况下,数组元素将在程序编译阶段自动初始化为0。

 static int a[4]        等价于       static int a[4]={0,0,0,0}

二维数组的初始化

1.   int a[3][4]={{1,2,3,4},{5,6,7,8}, {9,10,11,12}};  

2.    int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

3.如果对全部元素赋初值(即提供全部初 始数据),则定义数据时对第一维长度可 以不指定,但第二维长度不能省。

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};  等价于     int a[  ][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 

一维数组名作函数参数 :使用简单变量作函数参数,能由实参向形参传递一个数据。使用数组名作函数参数,属于“地址调用”能由主调函数向被调函数传递数组的首地址,并能由被调函数向主调函数传递多个数据。

形参和实参都指向了同一个内存,当形参修改时,形参也会改变。这种改变不是形参传给实参造成的(C 语言不允许这种反向的值传递),而是由于 形参和实参两个数组在内存中因指向同一地 址而共享同一段内存造成的。

 sub2()中的数组是局部变量,sub1()是全局。

 杨辉三角形:二维数组实现:

 一维数组实现:

 字符数组:

1.将逐个字符赋给数组中各元素。          char  c[10]={'I','  ','a','m','  ','h','a','p', 'p','y'};

⒉花括号中初值的个数大于数组长度,则按语法错误处理。

3.如初值个数小于数组长度,则只将这 些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即'\0')。          char  c[10]={'c','  ','p','r','o','g','r','a','m'};

⒋如初值个数等于数组长度,则在定义 时可以省略数组长度,系统会自动根据初值个数确定数组长度。          char  c[ ]={'I','  ','a','m','  ','h','a','p','p','y'};  

字符串在C语言中无字符串数据类型,将字符串作为字符数组处理

字符数组中,第一个字符串结束标志(\0)前的字符串,称为有效字符串。

 用二维字符数组可存放多个字符串,第二维的长度表示字符串的长度,不能省略,应按最长的字符串长度设定;第一维的长度代表要存储的字符串的个数,可以省略。       

1.字符串是采用字符数组来表示的,只是在有效字符串后自动加字符串结束标志'\0'。

2.字符数组不是字符串,只有当字符型一维数组中的最后一个元素值为’\0’时,它才构成字符串。 3.对于一个字符串常量,那么这个字符串常量本身代表的就是该字符串在内存中所占连续存储单元的首地址,是一个地址常量 。

4.如果将字符串赋值给了一个一维数组,那么这个一维数组的名字就代表这个首地址

字符串的输入和输出:

利用循环,逐个字符输入输出。用格式赋%c输入或输出一个字符。

将整个字符串一次输入或输出。用格式赋%s输入或输出一个字符串。

⒈输出字符不包括结束符‘\0’,只作为结 束标志,输出 遇‘\0’时,输出结束。

2.用%s格式符输出字符串时,printf函     数中的输出项是字符数组名,而不是  、数组元素名。 printf("%s",c[0]);        printf("%s",c);

3.如果数组长度大于字符串实际长度,也只输出到遇‘\0’结束 。    

char  c[10]="China";     printf("%s",c);        ==>        China

4.如果一个字符数组中包含一个以上的 ‘\0’,则遇第一个'\0'时就结束 。

字符串处理函数:最好自己实现这些函数

指针:

直接按变量名来存取变量内容的访问方式, 称为直接寻址。

通过指针变量来间接存取它所指向的变量的访问方 式,称为间接寻址。

本质:变量是通过变量地址来访问变量内容的。

int  A,*p;   p=&A;*P和变量A作用是等价的。

 一般情况下,指针变量中的地址是内存中 另一个普通变量的首地址。如果一个指针变量中 存放的是另一个变量的首地址,我们就称第一个 变量是指向第二个变量的指针。

⒈指针变量前面的*号,表示该变     量的类型为指针型变量。不是进 行指针运算。

 ⒉.在定义指针变量时,必须指定基     类型。     是由于指针型变量有运算:使指 针加1;使指针移到下一位置。

⒊.指针变量必须先定义,后使用。    

⒋.由于指针的值就是地址,因此,指针 运算实质上就是对地址的运算。

a=*p++      先运算p++,但为后增运算,因而先将*p的值赋给a,然后p加1。

a=(*p)++    先取*p的值,赋给a。然后将p所指向的变量内容加1。  

字符指针 :

⒈. char str[10 ];   定义的是一个字符数组。

char *ptr;        定义的是一个字符指针。

2. char *ptr="China"; 表示定义字符指针变量ptr,并在定义时用字 符串"China"在内存中的首地址为指针变量ptr 赋初值。

3.char *ptr,str[10]; ptr=“China”;  字符串的首地址赋给了ptr。

⒋char *ptr,str[10]; scanf("%s",str); 用字符指针输入字符串时,必须确保字符指针 事先已指向了一个数组的首地址。ptr=str;

⒌字符数组的数组名是一个地址常量,它的值 是不能改变的,而字符指针是一个变量,它的 值是可以改变的。

⒍字符数组可用于存放字符串,直接通过数组 元素存取字符串属于直接寻址,字符指针则属 于间接寻址。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值