描述一下什么是函数的声明和函数的定义?

函数的声明是告诉主调函数存在这样的一个函数,可以声明写在前面,定义写在后面

函数的声明要求有返回值类型,函数名称,形式参数

void func(int a);
int main
{

return 0;
}

void func(int a)
{



}

函数的声明可以写很多次,但是定义只能有一次

自己写一个函数定义,然后调用该函数,再使用VS单步调试代码,并绘制内存中的栈的内容。

C语言中函数是放在栈当中的所以函数是First In Last Out;同时逐过程是直接完成函数,想要看到函数内部细节要用逐步

(选做题)使用VS单步调试下面的代码,仔细阅读VS的调用堆栈窗口

#include <stdio.h>
void func(int i){
	if(i == 0){
		return;
    }
    else{
        printf("i = %d\n", i);
		func(i-1);
    }
}
int main(){
    func(2);
    return 0;
}
  1. 从变量的生存期、变量存储的位置和变量的作用域来说明全局变量和局部变量的区别。
  2. 为什么下面代码当中,main函数里面的变量a不发生改变?

void func(int a){
    a = a + 1;
}
int main(){
    int a = 10;
    func(a);
    printf("a = %d\n", a);
    return 0;
}

C语言学习 | week03_分段函数_1知识点:函数

int piecewisefunc1(int a)
{
	if (a < 1)return a;
	if (a>=1 && a < 10)return 2 * a - 1;
	if (a >= 10)return 3 * a - 11;

}

C语言学习 | week03_分段函数_2知识点:函数

double piecefunc2(int x)
{
	if (x < 2 && x >= 0)return -x + 2.5;
	if (x < 4 && x >= 2)return 2 - 1.5*(x - 3)*(x - 3);
	if (4 <= x && x < 6)return x / 2.0- 1.5;
}

C语言学习 | week03_正整数反转知识点:函数

int reverse(int num)
{
	int ans = 0;
	while (num > 0)
	{
		ans = ans * 10 + num % 10;
		num /= 10;
	}
	return ans;
}

C语言学习 | week03_计算距离知识点:函数(选做题)

double  distance(int x1, int y1, int x2, int y2)
{
	int a = (x1-x2) *(x1-x2);
	int b = (y2 - y1)* (y2-y1);
	double ans = sqrt(a + b);
	return ans;

}

C语言学习 | week03_奇偶和知识点:函数

int even(int n)
{
	if (n % 2 == 0)return 1;
	else return 0;
}

数组有哪些特点?[]运算符在定义语句和非定义语句作用分别是什么?

有序性,内存连续性,首地址时间复杂度为1,静态的,固定的,索引从0开始

【】在定义语句中是实现数组的初始化,在非定义语句中是通过首地址和sizeof(数据类型)来访问数组元素;

数组中的元素arr[i]的地址如何计算?

location=&arr数组首地址+sizeof(数据类型)*i;

一维数组作为函数参数传递的时候会丢失什么信息?

因为C语言的设计会使得可以通过首地址随机访问任意元素,所以数组在传递给函数的时间会压缩成一个地址信息,会丢失长度信息;

二维数组arr[M][N]的本质是一个一维数组,这个一维数组有多少个元素,每个元素的类型是什么?arr[i][j]的地址是多少?为什么二维数组传递的时候,不能省略第二个维度?

这个一维数组有M个元素,每个元素是长度为N的数组:

arr[i][j]=&arr+sizeof(数据类型)*N*i+sizeof(数据类型)*j,所以在这里我们除了索引以外唯一需要的参数就是N列数,所以再传递的时间不能随便更改N的大小;不能忽略

C语言学习 | week03_循环数组 知识点:数组

	int n;
	scanf_s("%d", &n);
	int* arr = (int*)malloc(n * sizeof(int));
	for (int i = 0; i < n; ++i)
	{
		scanf_s("%d", arr + i);
	}
	int mov;
	scanf_s("%d", &mov);
	int act = mov % n;
	if (act == 0)
	{
		for (int i = 0; i < n; ++i)
		{
			printf("%d ", arr[i]);
		}

	}
	else
	{
	int* ptr = (int*)malloc(act* sizeof(int));
	for (int i = 0; i < act; ++i)
	{
		ptr[act-1-i] = arr[n - 1 - i];
	}
	int* brr = (int*)malloc(n * sizeof(int));
	for (int i = 0; i < n; ++i)
	{
		brr[i] = arr[i];
	}
	for (int i = 0; i < n - act; ++i)
	{
		arr[i + act] = brr[i];
	}
	for (int i = 0; i < act; i++)
	{
		arr[i] = ptr[i];
	}
	for (int i = 0; i < n; ++i)
	{
		printf("%d ", arr[i]);
	}
	free(ptr);
	free(brr);
	free(arr);
	}

C语言学习 | week03_统计分数 知识点:数组

	统计分数
	int n;
	scanf_s("%d", &n);
	int a=0, b=0, c=0, d=0, e=0, f = 0;
	while (n > 0)
	{
		
		int score;
		scanf_s("%d", &score);
		if (score < 60)f++;
		if (score >= 60 && score < 70)e++;
		if (score >= 70 && score < 80)d++;
		if (score >= 80 && score < 90)c++;
		if (score >= 90 && score < 100)b++;
		if (score == 100)a++;
		
		n--;
	}

printf("%d %d %d %d %d %d", f, e, d, c, b, a);

C语言学习 | week03_有序插入 知识点:数组

	int* arr = (int*)malloc(10* sizeof(int));
	for (int i = 1; i <= 9; ++i)
	{
		scanf_s("%d", arr+i);
	}
	int insert;
	scanf_s("%d", &insert);
	for (int i = 1; i <= 9; ++i)
	{
		if (insert > arr[i])
		{
			arr[i - 1] = arr[i];
		}
		else
		{
			arr[i - 1] = insert;
			break;
		}
	}
	for (int i = 0; i < 10; ++i)
	{
		printf("%d\n", arr[i]);
	}
		

C语言学习 | week03_找最大值 知识点:数组

	int max = INT_MIN;
	int a=0;
	int count=0;
	while (scanf_s("%d", &a)!=EOF)
	{
		if (a > max)
		{
			max = a;
		}
		count++;
		if (count%10==0)
		{
			printf("max=%d\n", max);
			max = INT_MIN;
		}
	}

C语言学习 | week03_合并有序数组 知识点:数组


	//week03_合并有序数组
	int m;
	int x = 1;
	while (scanf_s("%d", &m) != EOF)
	{
		int* arr = (int*)malloc(sizeof(int) * m);
		for (int i = 0; i < m; ++i)
		{
			scanf_s("%d", arr + i);
		}
		int n;
		scanf_s("%d", &n);
		int* brr = (int*)malloc(sizeof(int) * n);
		for (int i = 0; i < n; ++i)
		{
			scanf_s("%d", brr + i);
		}
		int* crr = (int*)malloc(sizeof(int) * (m+n));
		for (int j = 0; j < n; ++j)
		{
			crr[j] = brr[j];
		}
		for (int i = 0; i < m; ++i)
		{
			for (int j = n-1+i; j >=0; --j)
			{
				if (crr[j] >= arr[i])
				{
					crr[j + 1] = crr[j];
				}
				if (crr[j] < arr[i])
				{
					crr[j + 1] = arr[i];
					break;
				}

			}
		}
		for (int i = 0; i < n + m; ++i)
		{
			printf("%d ", crr[i]);
		}
		
		free(arr);
		free(brr);
		free(crr);
	}

这个只是pc 等我后面研究下

C语言学习 | week03_冒泡排序 知识点:数组(选做题)

	//bubble sort
	int n;
	scanf_s("%d", &n);
	int* arr = (int*)malloc(sizeof(int) * n);
	int length = n;
	for (int i = 0; i < n; ++i)
	{
		scanf_s("%d", arr + i);

	}//recive all ;
	//if n==1;
	if (n == 1)
	{
		printf("%d ", arr[0]);
	}
	else//至少两个
	{
		n--;
		while (n >= 0)//当索引n没填满all
		{
			int i = 0;
			int j = 1;
			while (j <= n)
			{
				if (arr[i] > arr[j])
				{
					int tempt = arr[i];
					arr[i] = arr[j];
					arr[j] = tempt;
				}
				i++;
				j++;
			}
			n--;
		}
	}
	for (int i = 0; i < length; ++i)
	{
		printf("%d ", arr[i]);
	}

有时间写注释是为了让自己好思考

C语言学习 | week03_方阵转置 知识点:二维数组

#include<stdio.h>
#include<stdlib.h>
void print_matrix_col(int n, int* arr,int i)//n矩阵列数,int 打印第几列
{
	for (int j = 0; j < n; ++j)
	{
		if (j== n - 1)
		{
			printf("%d", arr[i + j * n]);
		}
		else
		{
			printf("%d ",arr[i+j*n]);//一个数组里放矩阵,那么每个n个就是同一列下面的元素;
		}
	
	}
	printf("\n");
}
int main()
{
	//matrix transform
	int n;
	while (scanf("%d", &n) != EOF)
	{
		int* arr = (int*)malloc(sizeof(int) * (n * n));
		for (int i = 0; i < n*n; ++i)
		{
			scanf("%d", arr + i);
		}
		if (n == 1)
		{
			printf("%d", arr[0]);
			printf("\n");
		}
		else
		{
			for (int i = 0; i < n; ++i)
			{
				print_matrix_col(n, arr, i);
			}
		}


	}
  
}

随笔

int loc 000000DAFE6FFA84 loc+1 000000DAFE6FFA88

解释下64位是什么意思,内村就像房间吗,地址就是编号,我们采用16个16进制数表示所有的房间,对于一个16进制数我们能表示2^4种房间,16个16进制数就是2^4^16=2^64种可能,所以理论上来说我们能存储2^64个byte 一个byte是8个字节所以2^64*2^3=2^192bits

K=2^10;M=2^20;G=2^30

虽然 int*double* 行为不同,但存储指针变量本身的字节数(即 “指针占多少内存”)和类型无关,只和操作系统位数有关:

  • 32 位系统:所有指针(int*、double*、char*、自定义类型 *)都占 4 字节(存储 32 位地址);
  • 64 位系统:所有指针都占 8 字节(存储 64 位地址)。
  • 000000DAFE6FFA88 一个16进制数是0000所以两个16进制数对应一个byte:所以这个是8个byte

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐