完全理解数组与指针(1 )


一维数组:

不允许对数组的长度进行动态定义
数组必须先定义后使用
数组的定义:int i[10]
int b[] = {1,2,3,0,0,0}
等价于 int b[6] = {1,2,3}

字符数组:

字符数组是由若干个有效字符构成且以字符‘\0’作为结束标志的一个字符序列。

字符数组的定义:

char a[10];


字符数组的初始化:

对字符数的各个元素分别进行初始化

char a[3] = {'a','b'};  /*余下的自动补‘\0’,这时字符数组就变成了字符串*/

用字符串常量来给字符数组进行初始化

char a[13] = "helloworld!"

char ch[5] = "asdfg";//自动加上\0长度为6

 

char ch[5] ={'a','s','d','f','g'}; //不会自动加上\0,.

printf("%s" , ch);

%s 会从字符数组第一个元素的地址往后取,遇到\0才会截止。

 

初始化字符串,最好在后面加上\0,避免出问题。

char ch[5] ={'a','s','d','f','g'’\0’};

 

通过指针指向一个字符串。

 

char *P = "asdfg";//相当于一个字符数组,把字符数组的第一个字符的地址(首地址)赋给了指针变量p

 

printf("%s" ,p);//不能用*p,%S取的是首地址,*p表示第一个字符。


字符数组的输入输出:

char c[6]

(1)用格式符“%c”逐个输入输出字符:

scanf("%c",&c[1]);

printf("%c",c[1]);

(2)用格式符“%s”整个输入输出字符串:

scanf("%s",c);

printf("%s",c);


字符数组与字符串的区别:

字符数组用来存放和处理字符数组且不加结束标识符就“\0”时,则在程序中只能逐个引用字符数组中的各个字符,而不能一次引用整个字符数组。而字符串则可以对其引用整个数组。其操作的方式一个是数组元素,一个是数组名


字符串处理函数:

1)输入字符串函数

char * gets(char * str);    //stdio.h

在使用gets()输入字符串时,可以包括空格在内的字符,在回车时,自动将字符串结束标志‘\0’赋予字符数组的最后一个元素。

2)输出字符串函数

int puts(char * str);    //stdio.h

在使用puts()输出字符串时,将字符串结束标志‘\0’转换成‘\n’输出。

3)字符串复制函数

char * strcpy(char * strl,char* str2);   //string.h

不能使用‘=’赋值语句对字符数组整体赋值,只能使用strcpy()处理。

4)字符串比较函数

int strcmp(char * str1,char *str2);   //string.h

字符串比较不能使用if(str1 == str2)的形式,只能使用strcmp();

5)字符串长度测量函数

unsigned int strlen(char *str);

不包括字符串结束字符‘\0’

6)找字符或字符串位置函数

查找字符的位置:

char * strchr(char * str,charch);

查找字符串的位置:

char * strstr(char * str1,charstr2);

指针

可以简单的认为指针就是地址,地址就是指针。一个变量的地址只能使用&符号获得。


指针变量:

C语言中指针被用来标识号内存单元的地址,如果把这个地址用一个变量来保存,则这个变量就成为指指针变量。

如指针变量pi只想变量i,那么pi就表示变量i的地址,*pi就表示变量i的值,pi=&ii=3*pi=3等价

指针变量的使用:

先定义,后使用。
定义的一般形式:数据类型 *指针变量名;
指针变量与普通变量建立联系的方法(为指针赋值):

指针变量名=&普通变量名;

说明:

1)由于数组名就是该数组的首地址,所以指针变量与数组建立联系时,只需将数组名赋予指针变量即可。
2)当指针变量没有赋值时,可以赋空指针NULL0,不能间接引用没有初始化或值为NULL的指针。
3&取地址运算符,*取只想的值的运算符。

指针变量的引用方式:

1*指针变量名:表示所指变量的值。//这个 *,个人感觉可以理解为还原符,就是还原为所指向的值。
2)指针变量名:表示所指变量的地址

使用指针作为函数的参数:

#include<stdio.h>

void swap(int *x, int *y);

void main(){

         int a=3, b=4;

         printf("main1:a=%d,b=%d\n", a, b);

         swap(&a, &b);

         printf("main2:a=%d,b=%d\n", a, b);

}

void swap(int *x, int *y){    

         int a;

         printf("swap1:a=%d,b=%d\n", *x, *y);

         a = *x;

         *x = *y;

         *y = a;

         printf("swap2:a=%d,b=%d\n", *x, *y);

}


指针的运算:

指针的运算通常只限于:+,-,++,--
(1)
指针变量加减一个整数的算术运算:

表示通过加减运算获取新的内存空间的地址:

p+1,p+c*i(c表示指针变量所指向的数据类型所占用的字节数)

(2)两个指针变量之间的算术运算:

只有减法运算,不能进行加法运算,表示两个指针变量之间的变量个数。

(3)两个指针变量之间的比较:

==,!=,<,>,<=,>=,结果为真(1)或假(0

(4)指针变量可以指向一个空值

有效数据的指针补指向0单元,对NULL指针不能使用间接引用。

空指针与未对指针变量p赋值是两个不同的概念:

空指针指向0单元,而未对指针赋值表示该指针可能指向一个未知的值。


指针与一维数组:

指向一维数组的指针变量:

指向一维数组的指针成为数组指针。

赋值: p = &a[0]或者 p = a

获取数组元素a[i]的值:*(a+i)

指针表示法比下标表示法快的原因:
C编译时,数组元素a[i]被解释成*(a+i),即按照数组的首地址加上指针相对位移量得到要找的元素的地址,然后找出该单元的内容。

指向一维数组元素的指针变量:

*p = &a[6];表示p是指针变量,将a[6]的地址赋予p

指向字符串的指针变量:

字符串是特殊的一维数组,不过,指向字符串的指针变量的使用方法与指向一般数组的指针变量有所不同。

字符指针:

char *sp = "Helloworld!!!";

指向字符数组的字符指针:

char str[] = "Helloworld!!!", sp = str;

二维数组:


定义:

数据类型数组名 [行数常量表达式][列数常量表达式];


运算:

赋值运算:a[2][1] = 3;
取地址预算:&a[2][3];
算术运算:a[1][0] = a[0][0] + 1;
其他运算:a[i][j] > 0;


初始化:

1)按行初始化

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

2)按顺序初始化

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

3)使用关键字static赋值

当定义静态存储数组时,如果没有赋初值,则系统自动将全部元素赋予0值或‘\0’值。

4)对部分元素赋初值

数组在对部分元素赋初值时,如果后面的数组元素不赋初值,系统会对未赋值的所有数组元素自动赋予0值或‘\0’值。

5)全部赋值时数组第一维长度可以省略

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

6)缺省数组第一维长度的部分赋值

应使用分行赋值方式明确指定行数

int a[][2] = {{1,},{1,2,},{2}}

7)通过键盘输入
8)通过赋值语句逐个元素赋初值

二维数组作函数的参数:

二维数组作为函数的参数时,时地址传递方式,在被调函数中对数组元素的改变,会影响到主调函数,对二维数组而言,在主调函数和被调函数中使用数组的方法都一样。

在定义被调函数时,二维数组的形参的第一维大小可有可无,有第一维大小时,可以可以时任意大小;而第二维的大小必须有,并且和主调函数中相应的二维数组的第二维的大小一致。


二维字符串:

求四个字符串中最小字符串的问题:

#include<stdio.h>

void minstring(char s[][20],int n, char min[]);

void main(){

         int i,j;

         char a[4][20], min[20];

         for(i = 0; i < 4; i++){

                   gets(a[i]);

         }

         minstring(a, 4, min);

         printf("min string is: %s\n", min);

}

void minstring(char s[][20],int n, char min[]){

         char i;

         strcpy(min, s[0]);

         for(i = 0; i < n; i++)

                   if(strcmp(min, s[i]) > 0)

                              strcpy(min, s[i]);

}

 

  一个字符串可以放在一个一维数组中。如果有若干个字符串,可以用一个二维字符数组来存放它们。二维字符数组可以认为由若干一维数组组成,因此一个nm列的二维字符数组可以存放n个字符串,每个字符串的最大长度为m-1。例如:

char s[3][6]={“China”,“Japan”,“Korea”};

  可以引用二维字符数组中某一行某一列的元素,也可以输入输出某一行的元素。例如:

gets(s[1]); puts(s[1]);

  例7.11  分析下列程序的运行结果。

main( )

{

char s[3][6]={“China”,“Japan”,“Korea”};

s[1][5]=‘\x20’;printf(“%s”,s[1]);

}

  说明:字符串“Japan”后面的字符由原来的‘\0’字符变成为空格字符。因此,从str[1]开始的字符串就变成“Japan Korea”

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值