一、典型例题
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进程空间图