C语言基础篇三

一、典型例题
1.求水仙花数的函数

void Fun4(int n)//n的最大值为999
{
	int a,b,c;
	for(int i = 100;i <= n;i++)//
	{
		a = i/100;//百位数
		b = i % 100/10;//十位数
		c = i %10;//个位数
		if(a*a*a+b*b*b+c*c*c == i)//水仙花数的判断条件
		{
			printf("%d ",i);
		}
	}
	printf("\n");
}

2.判断是否为完数?

bool IsPerfect(int n)
{
	int sum  = 0;
	for(int i = 1;i < n;i++) 
		{
		   if(n % i == 0)
			{
			sum += i;
			}
		}
	  if(sum == n && n != 0)
		return true;
		}
	else
		return false;
}

3.求连续子数组的最大值函数

int MaxNum(int *arr,int len)
{
	assert(arr != NULL && len > 0);
	int max = 0x80000000;//int类型的最小值
	int sum = 0;
	for(int i = 0; i < len;i++)
	{
	    if(sum <= 0)
		{
			sum = arr[i];
		}
		else 
		{
			sum += arr[i];
		}
      if(sum > max)
		{
			max = sum;//10  18
		}
	}
	return max;
}

4.将斐波那契额数列传入数组中

void Fabonacio(int *arr,int len)
{
	assert(arr != NULL && len > 0);
	arr[0] = 1;
	arr[1] = 1;
	for(int i = 2;i < len;i++)
	{
		arr[i] = arr[i-1]+arr[i-2];
	}
}

二、一维数组知识点
1.数组名有两种情况代表的是整个数组:

  • sizeof(arr)//整个数组的字节大小
  • &arr+1;//数组最后一个元素的后面地址
    2.访问数组当中元素的方法:
  • 可以通过下标去访问 arr[1]
  • 通过指针的形式访问 *p[1]
    3.sizeof和strlen异同
    相同点:都是计算数组的大小
  • sizeof是在编译时计算其值,不参与运算,包括\0。
    例如:
    int a = 10;
    sizeof(a++);
    计算结果是4,a的值没有发生变化(即没有进行a++运算)
  • strlen是在运行时才能计算,遇到\0停止运算,不包括\0。
  • sizeof是运算符,strlen是函数。
    4.通过以下程序来学习
#include<stdio.h>
#include<string.h>
int main()
{   
	char str[100] = "abcdef";
	char *str2 = "abcdef";
	char str3[] = "abcdef";
	char str4[100] = "abcdef\0xyz";
	char *str5 = "abcdef\0xyz";
	char str6[] = "abcdef\0xyz";//默认加\0
	char str7[] = "abcdef\n\0";//默认加\0
	char *str8 = "abcdef\n\0";
	printf("%d,%d\n",sizeof(str),strlen(str));//100 6//sizeof(str)表示整个数组所占字节数
	printf("%d,%d\n",sizeof(str2),strlen(str2));//4 6
	printf("%d,%d\n",sizeof(str3),strlen(str3));//7 6
	printf("%d,%d\n",sizeof(str4),strlen(str4));//100 6
	printf("%d,%d\n",sizeof(str5),strlen(str5));//4 6
	printf("%d,%d\n",sizeof(str6),strlen(str6));//11 6
	printf("%d,%d\n",sizeof(str7),strlen(str7));//9 7
	printf("%d,%d\n",sizeof(str8),strlen(str8));//4 7
}

5.字符数组的定义

    char crr[5] = {'a','b','c','d','e'};//字符数组
	char crr2[5] = "abcd";//字符数组 默认会加\0
	char crr3[] = "abcdef";//字符数组 默认会加\0
	char crr4[10] = "abcdef";
	printf("%s\n",crr);
	printf("%s\n",crr2);
	printf("%s\n",crr3);
	printf("%s\n",crr4);
	crr4[0] = 'g';//错误,字符串不允许被修改,由于存储在rodata区,只读区
	char crr5[10] = crr4;//error,数组的整体赋值只有一次机会初始化
    char *const  str = "tulun";//默认会有一个\0
	printf("%s\n",str);//%s遇\0停止输出

6.%s的作用,字符串的性质

#include<stdio.h>
int main()
{
	char crr[5] = {'a','b','c','d','e'};//字符数组
	char crr2[5] = "abcd";//用字符数组存放字符串  默认会加\0(\0是字符串结束标志)
	char crr3[] = "abcdef";//字符数组 默认会加\0
	char crr4[10] = "abcdef";
	printf("%s\n",crr);
	printf("%s\n",crr2);
	printf("%s\n",crr3);
	printf("%s\n",crr4);
	///crr4[0] = 'g';//不能改变字符串
	//char crr5[10] = crr4;error
	//数组的整体赋值只有一次机会初始化
   char *const  str = "tulun";//用字符指针指向一个字符串 默认会有一个\0   const表示不能改变str的指向,在此定义中也不能改变其值。(字符串不能被修改)
	printf("%s\n",str);
}

运行结果如下:
在这里插入图片描述

由于第一个数组初始化时\0的位置无法找到,所以导致运行结果不是我们预想当中的结果。
7.’\0’ ‘0’ 0

char ch1 = 0x00;//值为0
char ch3 = 0;//值为0
char ch4 = '\0';//值为0
char ch2 = '0';//值为48

8.数组首元素地址访问

#include<stdio.h>
int main()
{
	int arr[5] = {10,2,3,4,5};
	int *p = arr;
	printf("%d\n",&arr);
    printf("%d\n",&arr[0]);
	printf("%d\n",p);
	printf("%d\n",arr);
}

9.Linux进程空间图
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43313035/article/details/83180456