#include<stdio.h>intmain(void){
int a =3;// 定义 整型变量 a, 赋初值 3int b =5;// 定义 整型变量 b, 赋初值 5int c;// 定义 整型变量 c, 无初值
c = a + b;// a + b ,将结果 赋值 给 cprintf("hello world\n");// %d:格式匹配符,匹配整型数据printf("%d\n", c /*注释*/);printf("c = %d\n", c);printf("%d + %d = %d\n", a, b, c);printf("%d + %d = &d\n", a, b, a+b);return0;}
1.4 こんにちは
#include<stdio.h>#definePI3.14// 定义常量 PI 宏定义// 我是一个单行注释君intmain(void){
printf("helloworld\n");/*
wo shi
一个多行注释
sir
*/printf("%d\n, PI");return0;}
2 定数変数とデータ型
2.1 定数
#include<stdio.h>#definePI3.1415// 常量intmain(void){
// 圆的面积 s = PI x 半径的平方// 圆的周长 l = 2 * PI * r //int r = 3; // 变量constint r =3;// 只读变量float s = PI * r * r;float l =2* PI * r;//printf("圆的周长为:%f\n", l); //18.849001//printf("圆的面积为:%f\n", s); //28.273500printf("圆的周长为:%.2f\n", l);// 指定小数点后保留2位, 对第3位做,4舍五入printf("圆的面积为:%.2f\n", s);// 指定小数点后保留2位return0;}
2.2 変数
#include<stdio.h>intmain(void){
int a;// 显示的做变量a的声明
a =56;// 变量使用、变量赋值。return0;}
2.3 データ型のサイズ
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>#defineN1024// 定义常量intmain(void){
int a =10;// 定义变量: 三要素short b =20;long c =30;longlong d =40;printf("================a===%d\n",sizeof(a));printf("================b===%d\n",sizeof(b));printf("================c===%d\n",sizeof(c));printf("================d===%d\n",sizeof(d));printf("int 大小为:%d\n",sizeof(int));printf("short 大小为:%d\n",sizeof(short));printf("long 大小为:%d\n",sizeof(long));printf("long long 大小为:%d\n",sizeof(longlong));system("pause");return EXIT_SUCCESS;}
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>#defineN1024// 定义常量intmain(void){
int a =3;short b =4;long c =5;// 5L 5llonglong d =6;// 5LL 5llprintf("sizeof(int) = %d\n",sizeof(int));printf("sizeof(short) = %d\n",sizeof(short));printf("sizeof(long) = %d\n",sizeof(long));printf("sizeof(long long) = %d\n",sizeof(longlong));printf("--------------------------------------\n");unsignedint aun =3;// 3uunsignedshort bun =4;// 3uunsignedlong cun =5;// 3luunsignedlonglong dun =6;// 3lluprintf("sizeof(unsigned int) = %d\n",sizeof(unsignedint));// aunprintf("sizeof(unsigned short) = %d\n",sizeof(unsignedshort));printf("sizeof(unsigned long) = %d\n",sizeof(unsignedlong));printf("sizeof(unsigned long long) = %d\n",sizeof(unsignedlonglong));}
2.4 符号なし整数型
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
size_t var =10;printf("var = %u\n", var);unsignedint a =10u;// 简写成 unsigned int a = 10;unsignedshort b =20u;// 简写成 unsigned short b = 20;unsignedlong c =30Lu;unsignedlonglong d =40LLu;printf("unsigned int 型数据值:%u\n", a);printf("unsigned short 型数据值:%hu\n", b);printf("unsigned long 型数据值:%lu\n", c);printf("unsigned long long 型数据值:%llu\n", d);system("pause");return EXIT_SUCCESS;}
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>// A -- 65 a -- 97 intmain(void){
char ch ='M';char var ='5';printf("ch = %c\n", ch +32);printf("var = %c\n", var +4);printf("'\\n\'的值为=%d\n",'\n');system("pause");return EXIT_SUCCESS;}
2.6 実数型
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
float m =3.145;double n =4.566545;printf("m = %08.2f\n", m);printf("n = %08.3lf\n", n);system("pause");return EXIT_SUCCESS;}
2.7 ベースと変換
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
int a =0x2C;// 等价 0x2c printf("10进制显示 a = %d\n", a);printf("8进制显示 a = %o\n", a);printf("16进制显示 a = %x\n", a);system("pause");return EXIT_SUCCESS;}
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
int a =10;int b =20;int c = a * b;int d =34/10;// 0.5//int m = 98 / 0;printf("d = %d\n", d);system("pause");return EXIT_SUCCESS;}
3.3.2 自動インクリメント演算 (a++ および ++a)
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
int a =10;int b =50;printf("a = %d\n", a++);// 先取值给%d, 在自增printf("----a = %d", a);printf("b = %d\n",++b);// 先自增,再取值。 printf("----b = %d\n", b);system("pause");return EXIT_SUCCESS;}
3.4 論理演算
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
int a =34;int b =0;char str[10]="hello";++str[0];printf("a = %d\n",!a);printf("b = %d\n",!b);printf("======%d\n", a &&!b);printf("------%d\n",!a || b);system("pause");return EXIT_SUCCESS;}
3.5 三眼視の操作
3.5.1 三眼操作の使用
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
//
int main(void)
{
int a = 40;
int b = 4;
int m = a < b ? 69 : a < b ? 3 : 5;
printf("m = %d\n", m);
printf("%d\n", a > b ? 69 : 100);
system("pause");
return EXIT_SUCCESS;
}
3.5.2 三眼手術ケース2
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>// intmain(void){
int a =10, b =20, c =30;int x =(a =1, c =5, b =2);printf("x = %d\n", x);printf("a = %d\n", a);printf("b = %d\n", b);printf("c = %d\n", c);system("pause");return EXIT_SUCCESS;}
3.6 暗黙的な型変換と強制的な型変換
3.6.1 暗黙的な変換
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>// 隐式类型转换。intmain(void){
int a =321;char ch = a;printf("ch = %d\n", ch);// 字符类型转换为整数类型system("pause");return EXIT_SUCCESS;}
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>// intmain(void){
int num =1;while(num <=100){
if((num %7==0)||(num %10==7)||(num /10==7))// 个位、10位、7的倍数{
printf("敲桌子\n");}else{
printf("%d\n", num);}
num++;// 递增}system("pause");return EXIT_SUCCESS;}
3.10 しながら行う
3.10.1 do…whie ステートメント
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>// while 的基础用法intmain(void){
int a =1;do{
a++;printf("a = %d\n", a);}while(a <10);system("pause");return EXIT_SUCCESS;}
3.10.2 水仙数問題
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>// 水仙花数:一个三位数。各个位上的数字的立方和等于本数字。 intmain(void){
int a, b, c;int num =100;do{
a = num %10;// 个位
b = num /10%10;// 十位
c = num /100;// 百位if(a*a*a + b*b*b + c*c*c == num){
printf("%d\n", num);}
num++;}while(num <1000);system("pause");return EXIT_SUCCESS;}
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>// 基础for循环intmain(void){
int i =1;// 循环因子int sum =0;for(; i <=100; i++){
sum = sum + i;//sum += i;}printf("sum = %d\n", sum);system("pause");return EXIT_SUCCESS;}
4.1.3 式2の省略
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>// 基础for循环intmain(void){
int i =1;// 循环因子int sum =0;for(; i <=100;){
sum = sum + i;//sum += i;
i++;}printf("sum = %d\n", sum);system("pause");return EXIT_SUCCESS;}
4.1.4 式の省略 123
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>// 省略表达式123,无限循环intmain(void){
int i =0;// 循环因子//for (;1;) // 死循环。while(k=1)for(;;){
printf("i = %d\n", i);
i++;}system("pause");return EXIT_SUCCESS;}
4.1.5 複数の式
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>// 表达式有多个intmain(void){
int i =0;int a =0;for(i =1, a =3; a <20; i++){
printf("i = %d\n", i);printf("a = %d\n", a);
a +=5;}system("pause");return EXIT_SUCCESS;}
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
int i =0;for(i =0; i <10; i++){
if(i ==5)goto ABX234;printf("i = %d\n", i);}for(int j =0; j <20; j++){
ABX234:printf("j = %d\n", j);}system("pause");return0;}
4.7 配列
4.7.1 配列の概要
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
int a =5, b =29, c =10;int arr[10]={
1,2,4,6,76,8,90,4,3,6};//int a = 109;printf("&arr[0] = %p\n",&arr[0]);// 取数组首元素的地址printf("arr = %p\n", arr);// 数组名system("pause");return EXIT_SUCCESS;}
4.7.2 配列のサイズと数
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
int a =5, b =29, c =10;int arr[12]={
1,2,4,6,76,8,90,4,3,6,6,8};//int a = 109;printf("数组大小:%u\n",sizeof(arr));printf("数组元素的大小:%u\n",sizeof(arr[0]));printf("数组元素个数:%d\n",sizeof(arr)/sizeof(arr[0]));system("pause");return EXIT_SUCCESS;}
4.7.3 配列の初期化
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>// 数组初始化intmain(void){
int arr[10];//int a = 109;
arr[0]=5;
arr[1]=6;
arr[2]=7;int n =sizeof(arr)/sizeof(arr[0]);for(size_t i =0; i < n; i++){
printf("%d\n", arr[i]);}system("pause");return EXIT_SUCCESS;}
4.8 配列の逆順
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>// 数组元素逆序intmain(void){
int arr[]={
1,6,8,0,4,3,9,2};// {2, 9, 3, 4, 0, 8, 6, 1}int len =sizeof(arr)/sizeof(arr[0]);//数组元素个数int i =0;// i表示数组的首元素下标int j = len -1;// 表示数组的最后一个元素下标int temp =0;// 临时变量 // 交换 数组元素,做逆序while(i < j){
temp = arr[i];// 三杯水法变量交换
arr[i]= arr[j];
arr[j]= temp;
i++;
j--;}// 打印交互后的 数组for(size_t n =0; n < len; n++){
printf("%d ", arr[n]);}printf("\n");system("pause");return EXIT_SUCCESS;}
4.9 バブルソート
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
int arr[]={
12,32,14,62,27,8,89};int n =sizeof(arr)/sizeof(arr[0]);// 数组元素个数int temp =0;// 临时变量for(size_t i =0; i < n; i++){
printf("%d ", arr[i]);}printf("\n");// 完成乱序数组的冒泡排序。for(size_t i =0; i < n -1; i++)// 外层控制行{
for(size_t j =0; j < n -1- i; j++)// 内层控制列{
if(arr[j]> arr[j +1])// 满足条件 三杯水交换{
temp = arr[j];
arr[j]= arr[j +1];
arr[j +1]= temp;}}}// 打印排序后的数组,确定正确性。for(size_t i =0; i < n; i++){
printf("%d ",arr[i]);}printf("\n");system("pause");return EXIT_SUCCESS;}
5. 2次元配列、文字列、関数
5.1 2次元配列
5.1.1 2次元配列の定義
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
int arr[3][4]={
{
2,7,8,5},{
75,8,9,8},{
26,37,99,9}};for(size_t i =0; i <3; i++)//行{
for(size_t j =0; j <4; j++)//列{
printf("%d ", arr[i][j]);}printf("\n");}printf("数组的大小为:%u\n",sizeof(arr));printf("数组行的大小:%u\n",sizeof(arr[0]));printf("数组一个元素的大小:%u\n",sizeof(arr[0][0]));printf("行数=总大小/一行大小:%d\n",sizeof(arr)/sizeof(arr[0]));printf("列数=行大小/一个元素大小:%d\n",sizeof(arr[0])/sizeof(arr[0][0]));printf("arr= %p\n", arr);printf("&arr[0] = %p\n",&arr[0][0]);printf("arr[0] = %p\n", arr[0]);system("pause");return EXIT_SUCCESS;}
5.1.2 2 次元配列の演習
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
/*
56 78 92
45 67 93
29 83 88
93 56 89
72 83 81
*/int scores[5][3]={
1,2,4,5,6,7,8,9};int row =sizeof(scores)/sizeof(scores[0]);int col =sizeof(scores[0])/sizeof(scores[0][0]);// 获取 5 名学生、3门功课成绩for(size_t i =0; i < row; i++){
for(size_t j =0; j < col; j++){
scanf("%c",&scores[i][j]);}}// 求一个学生的总成绩for(size_t i =0; i < row; i++)// 每个学生{
int sum =0;for(size_t j =0; j < col; j++)// 每个学生的成绩{
sum += scores[i][j];}printf("第%d个学生的总成绩为:%d\n", i +1, sum);}//求一门功课的总成绩for(size_t i =0; i < col; i++)// 第几门功课{
int sum =0;for(size_t j =0; j < row; j++)// 每门功课的第几个学生{
sum += scores[j][i];}printf("第%d门功课的总成绩为:%d\n", i +1, sum);}system("pause");return EXIT_SUCCESS;}
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>// 进阶版intmain(void){
char str[]="hello\0world";int i =0;while(str[i++]);printf("%d\n", i -1);// 等价于 printf("%d\n", strlen(str));system("pause");return EXIT_SUCCESS;}
5.4 文字列の連結
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
char str1[]="hello";// [ h e l l o \0 ]char str2[]="world";char str3[100];int i =0;// 循环 str1while(str1[i]!='\0')// '\0' != '\0'{
str3[i]= str1[i];// 循环着将str1中的每一个元素,交给str3
i++;}// str3=[h e l l o]//printf("%d\n", i); --> 5int j =0;// 循环 str2while(str2[j])// 等价于 while(str2[j] !='\0') 等价于 while(str2[j] != 0){
str3[i + j]= str2[j];
j++;}// str3=[h e l l o w o r l d]// 手动添加 \0 字符串结束标记
str3[i + j]='\0';printf("str3 = %s\n", str3);system("pause");return EXIT_SUCCESS;}
5.5 機能
5.5.1 関数宣言の定義
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>voidbubble_sort(int arr[]);// 函数声明 int arr[] 函数形参voidprint_arr(int arr[]);intmain(void){
printf("add = %d\n",add(2,6));int arr[]={
54,5,16,34,6,9,34,1,7,93};bubble_sort(arr);print_arr(arr);system("pause");return EXIT_SUCCESS;// 底层 调用 _exit(); 做退出}voidprint_arr(int arr[]){
for(size_t i =0; i <10; i++){
printf("%d ", arr[i]);}}voidbubble_sort(int arr[]){
int i, j, temp;for(i =0; i <10-1; i++){
for(j =0; j <10-1- i; j++){
if(arr[j]< arr[j +1]){
temp = arr[j];
arr[j]= arr[j +1];
arr[j +1]= temp;}}}}intadd(int a,int b){
return a + b;}
5.5.2 終了関数
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intfunc(int a,char ch);intmain(void){
int ret =func(10,'a');printf("ret = %d\n", ret);system("pause");//return EXIT_SUCCESS;exit(EXIT_SUCCESS);}intfunc(int a,char ch){
printf("a = %d\n", a);printf("ch = %c\n", ch);//return 10;exit(10);}
6. ポインタ
6.1 ポインタの基本
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
int a =10;int* p =&a;//*p = 2000;
a =350;//printf("a = %d\n", a);printf("*p = %d\n",*p);printf("sizeof(int *) = %u\n",sizeof(int*));printf("sizeof(short *) = %u\n",sizeof(short*));printf("sizeof(char *) = %u\n",sizeof(char*));printf("sizeof(long *) = %u\n",sizeof(long*));printf("sizeof(double *) = %u\n",sizeof(double*));printf("sizeof(void *) = %u\n",sizeof(void*));system("pause");return EXIT_SUCCESS;}
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
int a =345;char ch ='R';void* p;// 万能指针、泛型指针//p = &a;
p =&ch;printf("%c\n",*(char*)p);system("pause");return EXIT_SUCCESS;}
6.4 const関数
6.4.1 修飾子変数
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>// 修饰变量intmain(void){
constint a =20;int* p =&a;*p =650;printf("%d\n", a);system("pause");return EXIT_SUCCESS;}
6.4.2 const int *p
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>// const int *p;intmain(void){
int a =10;int b =30;constint* p =&a;//*p = 500;
p =&b;printf("*p=%d",*p);system("pause");return EXIT_SUCCESS;}
6.4.3 int const *p
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
int a =10;int b =30;intconst* p =&a;//*p = 300;
p =&b;printf("*p=%d",*p);system("pause");return EXIT_SUCCESS;}
6.4.4 int * const p
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
int a =10;int b =30;int*const p =&a;*p =300;//p = &b;printf("a = %d\n",*p);printf("a = %d\n", a);system("pause");return EXIT_SUCCESS;}
6.4.5 const int * const p
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
int a =10;int b =30;constint*const p =&a;//*p = 300;//p = &b;printf("a = %d\n",*p);printf("a = %d\n", a);system("pause");return EXIT_SUCCESS;}
6.5 ポインタと配列
6.5.1 配列演算
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>// 操作数组元素的 4 种方法intmain(void){
int a[]={
1,2,4,5,6,7,8,9,0};int n =sizeof(a)/sizeof(a[0]);int* p = a;printf("sizeof(a) = %u\n",sizeof(a));printf("sizeof(p) = %u\n",sizeof(p));for(size_t i =0; i < n; i++){
//printf("%d "), a[i];//printf("%d ", *(a+i)); // a[i] == *(a+i)//printf("%d ", p[i]);printf("%d ",*(p + i));// p[i] = *(p+i)}printf("\n");system("pause");return EXIT_SUCCESS;}
6.5.2 ポインタの操作
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>// 使用指针++操作数组元素intmain(void){
int arr[]={
1,2,4,5,6,7,8,9,0};int* p = arr;int n =sizeof(arr)/sizeof(arr[0]);printf("first p = %p\n", p);for(size_t i =0; i < n; i++){
printf("%d ",*p);
p++;// p = p+1; 一次加过一个int大小。 一个元素。}putchar('\n');printf("last p = %p\n", p);system("pause");return EXIT_SUCCESS;}
6.6 ポインタ算術演算
6.6.1 ポインタ±操作
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>// 指针在数组中 +- 整数intmain(void){
int a[]={
1,2,4,5,6,7,8,9,0};//int *p = a; // a == &a[0];int* p =&a[5];printf("p-2 = %p\n", p -2);printf("&a[3] = %p\n",&a[3]);system("pause");return EXIT_SUCCESS;}
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>// 指针加减指针intmain(void){
int a[10]={
1,2,3,4,5,6,7,8,9,0};int* p = a;for(size_t i =0; i <10; i++){
printf("%d ",*p);
p++;}printf("p - a = %d\n", p - a);system("pause");return EXIT_SUCCESS;}
6.6.4 strlen 実装 (ポインタ)
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmystrlen(char arr[]);intmain(void){
char abc[]="hello world";int ret =mystrlen2(abc);// 实际参数 abcprintf("ret = %d\n", ret);system("pause");return EXIT_SUCCESS;}// 借助数组 实现 intmystrlen(char str[]){
int i =0;while(str[i]!='\0'){
i++;}return i;}// 借助指针++ 实现 intmystrlen2(char str[]){
char* p = str;while(*p !='\0'){
p++;}return p - str;// 返回数组元素的个数。}
#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>// 指针数组1intmain(void){
int a =10;int b =20;int c =30;int* p1 =&a;int* p2 =&b;int* p3 =&c;int* arr[]={
p1, p2, p3 };// 整型指针数组arr, 存的都是整型地址。printf("*(arr[0]) = %d\n",*(*(arr +0)));//arr[0] == *(arr+0)printf("*(arr[0]) = %d\n",**arr);system("pause");return EXIT_SUCCESS;}
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>// 指针数组2intmain(void){
int a[]={
10};int b[]={
20};int c[]={
30};int* arr[]={
a, b, c };// 整型指针数组arr, 存的都是整型地址。printf("*(arr[0]) = %d\n",*(*(arr +0)));//arr[0] == *(arr+0)printf("*(arr[0]) = %d\n",**arr);system("pause");return EXIT_SUCCESS;}
6.9 マルチレベルポインタ
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
int a =10;int* p =&a;int** pp =&p;// int **pp = &(&a); 不允许!!int*** ppp =&pp;printf("***ppp = %d\n",***ppp);printf("**pp = %d\n",**pp);printf("*p = %d\n",*p);printf("a = %d\n", a);system("pause");return EXIT_SUCCESS;}
7. ポインタと文字列
7.1 値とアドレスの受け渡し
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intswap(int,int);// 函数声明intswap2(int*,int*);intmain(void){
int m =23;int n =57;printf("--before-- m = %d, n = %d\n", m, n);// 函数调用//swap(m, n); // m/n 实参swap2(&m,&n);printf("--after-- m = %d, n = %d\n", m, n);system("pause");return EXIT_SUCCESS;}intswap2(int* a,int* b)// 形参a、b, 需传地址值{
int tmp =0;
tmp =*a;*a =*b;*b = tmp;return0;}// 函数定义intswap(int a,int b)// a/b 形参{
int tmp =0;
tmp = a;
a = b;
b = tmp;return0;}
7.2 関数パラメータとしての配列
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>//void BubbleSort(int arr[]) // void BubbleSort(int *arr)voidBubbleSort(int* arr,int n){
for(int i =0; i < n -1; i++){
for(int j =0; j < n -1- i; j++){
if(arr[j]> arr[j +1]){
int temp = arr[j];
arr[j]= arr[j +1];
arr[j +1]= temp;}}}}intmain(void){
int arr[]={
5,89,3,22,40,31,9,22,67,28,45,78};printf("main: sizeof(arr) = %d\n",sizeof(arr));int n =sizeof(arr)/sizeof(arr[0]);BubbleSort(arr, n);for(size_t i =0; i < n; i++){
printf("%d ", arr[i]);}printf("\n");system("pause");return EXIT_SUCCESS;}
7.3 関数の戻り値としてのポインタ
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>int m =100;// 全局变量 对应空间消失 ==> 程序结束。int*test_func2(int a,int b){
int p =1234;// 局部变量//return &m;return&p;}intmain(void){
int* ret =NULL;// NULL == 0
ret =test_func2(10,20);printf("ret = %d\n",*ret);system("pause");return EXIT_SUCCESS;}
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
char str[]="www.itcast.cn.com.net";// www baidu comchar* p =strtok(str,".");// 第一次拆分,参1 传 待拆分的原串。while(p !=NULL){
p =strtok(NULL,".");// 第1+ 次拆分是,参1传 NULL.printf("%s\n", p);}system("pause");return EXIT_SUCCESS;}
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
char str[]="www.baidu.com$This is a strtok$test";char* p =strtok(str,"$ .");//strtok函数的第一个参数不为NULL,函数将找到str中第一个被分割的字符串,同时strtok还会记住该分割符的位置// strtok函数的第一个参数为NULL,函数将在之前strtok记住的分隔符的位置开始,查找下一个标记while(p !=NULL){
p =strtok(NULL,". $");printf("p = %s\n", p);}system("pause");return EXIT_SUCCESS;}
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>voidtest1(void);// 全局函数声明int m =4456;intmain(void){
int i =10903;for(size_t j =0; j <10; j++){
printf("j = %d\n", j);//test1();}printf("i 2 = %d\n", i);system("pause");return EXIT_SUCCESS;}
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
//int arr[1000000] = {10, 20, 40};int*p =(int*)malloc(sizeof(int)*10);//char *str = (char *)malloc(sizeof(char)*10);if(p ==NULL){
printf("malloc error\n");return-1;}char*tmp = p;// 记录malloc返回的地址值。用于free// 写数据到 malloc 空间。for(size_t i =0; i <10; i++){
p[i]= i +10;}// 读出malloc空间中的数据//for (size_t i = 0; i < 10; i++)//{
// printf("%d ", *(p+i));//}for(size_t i =0; i <10; i++){
printf("%d ",*p);
p++;}// 释放申请的内存。free(tmp);
p =NULL;system("pause");return EXIT_SUCCESS;}
8.3 ヒープスペースの適用
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
//int arr[1000000] = {10, 20, 40};int* p =(int*)malloc(sizeof(int)*10);//char *str = (char *)malloc(sizeof(char)*10);if(p ==NULL){
printf("malloc error\n");return-1;}char* tmp = p;// 记录malloc返回的地址值。用于free// 写数据到 malloc 空间。for(size_t i =0; i <10; i++){
p[i]= i +10;}// 读出malloc空间中的数据//for (size_t i = 0; i < 10; i++)//{
// printf("%d ", *(p+i));//}for(size_t i =0; i <10; i++){
printf("%d ",*p);
p++;}// 释放申请的内存。free(tmp);
p =NULL;system("pause");return EXIT_SUCCESS;}
8.4 セカンダリポインタの malloc 空間
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain(void){
int** p =malloc(sizeof(int*)*3);// int **p ==> int *p[10]; ==> [ int *, int *, int * ]for(size_t i =0; i <3; i++){
p[i]=malloc(sizeof(int)*5);}// 使用空间 -- 写for(size_t i =0; i <3; i++){
for(size_t j =0; j <5; j++){
p[i][j]= i + j;}}// 使用空间 -- 读for(size_t i =0; i <3; i++){
for(size_t j =0; j <5; j++){
printf("%d ",*(*(p + i)+ j));// p[i][j] == *(p+i)[j] == *(*(p+i)+j)}printf("\n");}// 释放空间时,应先释放内层空间。for(size_t i =0; i <3; i++){
free(p[i]);//*(p+i)
p[i]=NULL;}// 释放外层空间free(p);
p =NULL;system("pause");return EXIT_SUCCESS;}