C语言程序设计(第二版)知识点总结(中)

C语言程序设计(第二版)知识点总结(中),第1张

C语言程序设计(第二版)知识点总结(中)

C语言程序设计(第二版)知识点总结

五、数组

一维数组数组作为函数参数二维数组 六、字符数组与字符串

转义序列字符数据的输入问题处理字符的函数字符数组与字符串常用字符串函数字符串数组 七、指针

一维数组与指针指针与字符串指针实现动态内存分配


五、数组 一维数组

数组是统一命名的一组变量,它们具有相同的名字的相同的数据类型,可以用数组名和每个元素在数组中的位置来访问数组元素。
一维数组初始化情况如下:

    数组初始化,数组初始化后,数组元素的初值为:a[0]值为1,a[1]值为2…
int a[10] = {1,2,3,4,5,6,7,8,9,10};
    部分数组元素初始化,如果初值表中数据个数比数组长度少,那么数组中剩余元素赋值为0。
int a[10] = {1,2,3};
    直接将数组全部初始化为0。
int a[10] = {0};

数组应用实例:

#include//斐波拉契数列
#define N 50

int main(void)
{
	int f[N];
	int n,i;
	
	scanf("%d",&n);
	f[0]=1;
	f[1]=1;
	
	for(i=2;i 
#include//比较交换排序
#define N 10

int main(void)
{
	int i,j,t,n;
	int a[N];
	
	printf("请输入元素个数:n");
	scanf("%d",&n);
	printf("请输入%d个元素n",n);
	
	for(i=0;ia[j])
			{
				t=a[i];
				a[i]=a[j];
				a[j]=t;
			 } 
	}
	printf("排序后:n");
	
	for(i=0;i 
数组作为函数参数 

数组名代表数组首元素的地址,因此数组名做参数就可以将数组的起始地址传递给形参。

#include//数组数据相加

int SumArr(int array[],int n);

int main(void)
{
	int b[5]={1,3,5,7,9};
	
	printf("%dn",SumArr(b,5));
	return 0;
 } 
int SumArr(int array[],int n)
{
	int i,s=0;
	
	for(i=0;i 

形参数组和实参数组实质上是同一块内存区域,为同一数组,所以形参数组发生改变,实参数组也随之改变。

#include//乘10变换

void ModifyArr(int array[],int n);

int main(void)
{
	int i;
	int a[5]={1,4,5,7,9};
	int n = 5;
	printf("数组a的内容:n");
	
	for(i=0;i 
二维数组 

二维数组本质上是以数组作为数组元素的数组,即“数组的数组”,类型说明符 数组名[常量表达式][常量表达式]。二维数组又称为矩阵,行列数相等的矩阵称为方阵。

#include//杨辉三角
#define N 6

int main(void)
{
	int a[N][N];
	int i,j,n;
	
	scanf("%d",&n);
	
	a[0][0] = a[1][0] = a[1][1] = 1;
	
	for(i=0;i 
六、字符数组与字符串 
转义序列 

字符常量通常是单引号括起来的单个字符,然而一些特殊的字符无法采用上述方式书写,于是使用转义字符。

字符数据的输入问题

scanf()函数和getchar()函数都可以用来读入单个字符,但如果下一个字符是空格,scanf()或getchar()会把读到的空格字符存入对应的变量,类似问题解决方法如下:

    getchar法
    通过调用getchar()函数将回车符读入:
scanf("%d",&n);
getchar();//将缓冲区的回车符读入
scanf("%c",&ch);
    赋值抑制符
    使用赋值抑制符“*”来跳过所读入的回车符:
scanf("%d",&n);
scanf("%*c%c",&ch);//用%*c将缓冲区的回车符读入但不存储
    scanf格式串中的空格符
    scanf格式串中的空格符意味着跳过零个或多个空白字符。
scanf("%d",&n);
scanf(" %c",&ch);
处理字符的函数

字符数组与字符串

C语言本来没有“字符串这种数据类型。通常用一个字符数组来存放一个字符串。字符串与普通字符数组的区别是:字符串的末尾有一个空字符’’,空字符不计入字符串有效字符。字符串中没有显式给出有效字符的个数,只规定在字符串结束符’’之前的字符都是字符串的有效字符,一般用’’来控制循环。循环条件是s[i]!=’’。
输入输出:

    用%s整体输入/输出,格式描述串中使用转化字符串"%s"。
    用scanf()函数以%s格式读入的数据不能含有空白符,所有的空白符都被当做数据结束的标志。
char name[100];
scanf("%s",name);
printf("%s",name);
    用gets()和puts()函数:
    功能是读取字符串,并存放在指定字符数组中,遇到换行符或文件结束标志时结束读入。
gets(字符数组名);
puts(字符数组名);
常用字符串函数
    求字符串长度函数(以下函数的头文件为string.h)
    调用格式:strlen(str)
    功能:测试字符串长度,函数返回值是str中字符的个数。
char str[10]="China";
printf("%d",strlen("China"));//程序输出为5
    字符串复制函数
    调用格式:strcpy(str1,str2)
    功能:复制第二个参数的内容到第一个参数中。
    调用格式:strncpy(str1,str2,n)
    功能:复制第二个参数中最多n个字符的内容到第一个参数中。
char s1[10],s2[]="Beijing";
strcpy(s1,s2);
    字符串比较函数
    调用格式:strcmp(str1,str2)
    功能:比较字符串1和字符串2的大小,若前者大则返回一个正整数,若后者大则返回一个负整数,若两者相等,则返回0。
    调用格式:strncmp(str1,str2,n)
    功能:比较字符串1最多n个字符和字符串2的大小,若前者大则返回一个正整数,若后者大则返回一个负整数,若两者相等,则返回0。
strcmp("abc","abc");
    字符串连接函数strcat()和strncat()
    调用格式:strcat(str1,str2)
    功能:将第二个参数的内容添加到第一个参数的有效字符后面。
    调用格式:strncat(str1,str2,n)
    功能:将第二个参数的n个字符内容添加到第一个参数的有效字符后面。
char str1[21] = "Beijing and";
char str2[] = "Shanghai";
strcat(str1,str2);
printf("%s",str1);//输出为:Beijing and Shanghai
    字符串逆置函数
    调用格式:strrev(str)
    功能:将字符串前后颠倒。
char str[10] = "hello";
strrev(str);
puts(str);//程序的输出为:olleh
#include//输出最大字符串
#include
#define LEN 81
int main(void)
{
	int n,i;
	char str[LEN];
	char maxStr[LEN]="";
	
	printf("请输入字符串个数:");
	scanf("%d",&n);
	getchar();
	printf("请输入%d个字符串:",n);
	
	for(i=0;i0)
			strcpy(maxStr,str); 
	}
	
	printf("最大字符串:");
	puts(maxStr);
	return 0; 
}
    函数sprintf()(以下函数头文件为stdio.h)
    调用格式:sprintf(str,格式字符串,输出项列表)
    功能:与printf()唯一的不同是多了一个参数str,并且输出结果是保存在字符数组str中,而不是输出到屏幕。
sprintf(str,"Price is %d",d);
    函数sscanf()
    调用格式:sscanf(字符数组,格式字符串,输出项列表)
    功能:与scanf()唯一不同的是多了一个参数字符数组,并且是从字符数组中读入,而不是从键盘读入。
sscanf(str,"%*6d%4d%2d%2d",&year,&month,&day);
#include//水仙花数

int main(void)
{
    char str[10];
    int n,a,b,c;
    gets(str);
    sscanf(str,"%d",&n);             //作为一个三位整数读入;
    sscanf(str,"%1d%1d%1d",&a,&b,&c);//作为三个一位整数读入;

    if(n == a*a*a + b*b*b + c*c*c){
        printf("Yesn");        
    }
    else{
        printf("Non");
    }
    return 0;
}
字符串数组

一维字符数组可以存储一个字符串,二维字符数组可以存储多个字符串,这种用来存放字符串的数组称为字符串数组。字符串数组的每一行元素中都含有字符串结束符’’,因此它的每一行元素都可以和字符串一样输入、输出及初始化。

char color[][10] = {"red","blue","yellow"};
#include//二维字符数组实现多个字符串排序
#include
#include
#define N 100
#define LEN 81

void Sort(char str[][LEN],int n);

int main(void)
{
	int i,n;
	char str[N][LEN];
	
	printf("输入n和n个字符串n");
	scanf("%d",&n);
	getchar();
	
	for(i=0;i0)
			{
				strcpy(temp,str[i]);
				strcpy(str[i],str[j]);
				strcpy(str[j],temp);
			}
		}
}
七、指针

指针是用于表示内存地址的数据项。

指针的声明与普通变量的声明方式基本相同,唯一的不同是必须在指针变量名字前加一个“*”。

int *ptr;//ptr是一个指向int类型的指针

指针变量使用时必须赋初值,可以再定义指针时进行初始化,也可以通过一个赋值语句来完成。

int count = 5, *cntptr;
cntptr = &count;

指针的基本运算
&:取地址运算符;
*:访问指针所指内存对象。(间接寻址运算符)

一维数组与指针

指针与数组有着非常密切的关系,凡是由数组下标完成的 *** 作都可以用指针完成。
指针加/减一个整数的结果是另一个指针。如果指针p指向数组元素a[0],则p+1将指向数组元素a[1]。指针每增1,指针所指向的内存地址的增量是其所指向类型的大小(字节数),即指向下一个同类型元素。

#include

int main(void)
{
	double a[4] = {1.5,2,3,4};
	double *p;
	
	p = &a[0];
	printf("p中存储的地址值:%pn",p);
	printf("p所指变量的值:%.1fn",*p);
	
	p = p + 1;
	printf("p+1后n");
	printf("p中存储的地址值:%pn",p);
	printf("p所指变量的值:%.1fn",*p);
	
	return 0; 
}

同类型的指针相减结果为两个指针之间的距离,这个距离是用元素个数来度量,而不是用字节来度量。

#include

int main(void)
{
	double a[2],*p,*q;
	
	p = &a[0];
	q = &a[1];
	printf("%dn",(int*)q-(int*)p);
	printf("%dn",q-p);
	return 0;
}

数组相当于地址常量。

#include
#define N 100

int main(void)
{
	int i,n,a[N];
	int *ptr = a;
	
	scanf("%d",&n);
	for(i=0;i=0;i--)
		printf("%d ",a[i]);
		
	printf("n");	
	//用数组名/偏移量法引用数组元素
	for(i=n-1;i>=0;i--)
		printf("%d ",*(a+i));
		
	printf("n");	
	//用指针/偏移量法引用数组元素
	for(i=n-1;i>=0;i--)
		printf("%d ",*(ptr+i));
		
	printf("n");	
	//用指针下标法引用数组元素
	for(i=n-1;i>=0;i--)
		printf("%d ",ptr[i]);
		
	printf("n");	
	//用移动指针法遍历数组元素
	for(ptr=a+n-1;ptr>=a;ptr--)
		printf("%d ",*ptr);
	
	printf("n");	
	return 0;
}

数组名在参数传递时,总是被视为指针。数组名作为实参时,因数组名是指针常量,形参应该是同类型的指针变量。

指针与字符串

由指向首字符的指针和字符串结束标志’’就可以唯一地确定一个字符串。

    字符串常量为字符指针变量赋值
char *p;
p = "abcd";//内存首地址存入p
    字符串常量的指针运算
printf("%s","abcdef"+2);//输出cdef
    字符串常量的下标运算
char ch = "abcd"[2];//下标为2的字符'c'存入ch
void DToR(int n,char str[],int r)//将十进制转换为r进制
{
	int k = 0,d;
	
	while(n!=0)
	{
		d  = n%r;
		str[k] = "123456789abcdef"[d];
		k++;
		n=n/r;
	}
	str[k] = '';
	strrev(str);
}
指针实现动态内存分配

在C语言中,动态分配内存是通过动态存储分配函数 malloc()来实现的。malloc()函数功能是在内存的动态存储区中分配一连续空间。若申请成功,则返回指向所分配内存空间的起始地址的指针;若申请内存空间不成功,则返回NULL(值为0)calloc()函数为数组分配内存,大致同malloc()相同,区别是calloc()函数会通过把所有字节置0来初始化该内存空间。为数组分配完空间后可能会发现帅过大或者过小。realloc()函数可以调整已申请内存的大小。在动态内存分配时,应该在不需要该内存时将内存释放。如果频繁地申请内存而没有及时释放不再需要的内存,可能会将内存耗尽。free()函数用来释放不需要的内存。

#include //动态申请一个一维数组
#include//malloc的头文件

int main(void)
{
    int n,i,*p;

    scanf("%d",&n);
    p = (int *)malloc(n*sizeof(int));

    if(p == NULL)
    {
        printf("申请失败n");
        exit(0);
    }
    
    for(i=0;i=0;i--){
        printf("%d ",p[i]);
    }
    printf("n");
    free(p);
    return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5702959.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存