C Note 20210623

for()

for(int i = 0; i<100; i++) 
{
    printf("%d", i);     //This is OK.
}
printf("%d", i);     //Undefined var.
  • i 只能在for循环体内使用。
  • for()中的三个表达式都可以省略(通过别的方式替换),但必须有 ;
int i = 0;
for(; i<100;)
{
    printf("%d", i);
    i++;
}
  • 如果省略了 i<100 将变成死循环。
  • 亦可以有多个表达式。

数组

int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  • 数组中的每个元素,占用4字节(int的情况下)。
  • 数组的内存空间是连续的。
  • arr == &arr[0]
int main(void)
{
	int arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	for (int i = 0; i < 10; i++)
	{
		printf("&arr[%d] = %p\n", i, &arr[i]);
		/*
		&arr[0] = 00B3FCD0
		&arr[1] = 00B3FCD4
		&arr[2] = 00B3FCD8
		&arr[3] = 00B3FCDC
		&arr[4] = 00B3FCE0
		&arr[5] = 00B3FCE4
		&arr[6] = 00B3FCE8
		&arr[7] = 00B3FCEC
		&arr[8] = 00B3FCF0
		&arr[9] = 00B3FCF4
		数组中的每个元素占用4字节
		*/
	}
	printf("sizeof(arr) == %u\n", sizeof(arr));
	printf("sizeof(arr[0]) == %u\n", sizeof(arr[0]));
	printf("arr.length == %u\n", sizeof(arr) / sizeof(arr[0]));
	return EXIT_SUCCESS;
}

冒泡排序

int main(void)
{
	int arr[] = {3, 5, 7, 123, 66, 88, 34, 55, 2, 255, 23, 98, 254};   
	int size = sizeof(arr) / sizeof(arr[0]);  //13
    /*循环1*/
	for (int i = 0; i < size - 1; i++)    //每两个元素之间相比较,所以总循环次数为size - 1。
	{
        /*循环2*/
		for (int j = 0; j < size - 1 - i; j++)    //第一次循环i = 0; j = 0
		{
			if (arr[j] < arr[j + 1])      //arr[0] 与 arr[1] 比较 (3 < 5)
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];     //交换 arr[0] = 5, arr[1] = 3 
				arr[j + 1] = temp;
			}
		}
		printf("----%d----\n", i);
		for (int m = 0; m < size; m++)
		{
			printf("arr[%d] = %d\n", m, arr[m]);
		}
	}
    /*
	for (int i = 0; i < size; i++)
	{
		printf("arr[%d] = %d\n", i, arr[i]);
	}
    */
}
  • 由于是两两相比较,所以循环1只需要循环 size-1 次。
  • 循环1的每次循环,就会缩小循环2的循环范围。i = 1, j的最大值就只有size-1-i=11,所以已经比较过,并交换到末尾的数不会再次被比较。

其他

  • Sleep() -> Windows.h

总结

  • 涉及到算法问题,还是比较头疼,大概只能通过多练来增强了。leetcode走起来?
  • 以前还真不知道for的表达式可以省略,基础还是不牢。
Avatar photo 心有所向,日复一日,必有精进。 Twitter Tweet