书籍整理内容:
最近在看C primer plus(加深巩固自己的C语言技巧,为以后学习C++打个基础)。
里面知识针对自己以后要查的点整理出来。
使用工具:visual studio 2013
第二、三章内容:概述、变量、基本数据类型等:https://blog.csdn.net/answerMack/article/details/103766020
第四章内容:字符串和格式化输入输出:https://blog.csdn.net/answerMack/article/details/103805900
第五章内容:运算符、表达式和语句:https://blog.csdn.net/answerMack/article/details/103855794
第六章内容:循坏、赋值运算符等:https://blog.csdn.net/answerMack/article/details/103870182
第七章内容:if、if else、?:、switch、goto、continue、逻辑运算符优先级https://blog.csdn.net/answerMack/article/details/103891048
第八章内容:字符输入输出函数、输入验证(混合输入)https://blog.csdn.net/answerMack/article/details/103953376
第九章内容:函数和指针:https://blog.csdn.net/answerMack/article/details/103978471
目录
数组(重点:自动存储类别)
初始化数组
1、直接赋值
例子:
判断数组大小:sizeof
第三章内容:
2.指定初始化器
3.循环赋值
重点:
C不允许数组作为一个单元赋给另一个数组,初始化外也不允许使用花括号形式赋值。
4.无效例子
C语言的编译器:信任程序员,不检查数组边界。数组元素编号从0开始,最好是在声明数组时使用符号常量表示数组的大小。
多维数组
二维数组
float rain[5][12] ;//数组rain是一个内含5个数组元素的数组,每个元素内含12个float类型的值的数组,即rain是一个5行12列的二维数组。
通过后面指针可知,rain为rain[0]的地址,是包含12个float类型值的指针。
声明函数形参时:float (* pt)[12]
初始化:
多维数组
指针和数组关系(指针见第九章&和*,%p)
short dates[4];//short类型, 其中dates为数组初始地址,*dates为dates[0]的值
dates+2==&dates[2];//相同的地址
*(dates+2)==dates[2]; //相同的值
1、指针表示数组
*(dates+2)== dates[2]; //相同的值
2、数组表示指针
数组名为该数组首元素的地址
pti=dates+2== &dates[2];//相同的地址
202-01-30在家太懒了,哈哈哈。
函数、数组、指针关系
数组名是该数组首元素的地址。
函数引用数组方法:
1、指针引用
定义:
int marbles[20]={1,2,3,4,5,6,7,8,9,10,......};//数组初始化
total=sum(marbles);//数组名为数组首地址,传递给sum函数
sum函数定义:
int sum(int * pt){
int total=0;
for(int i=0;i<20;i++)
total+=pt[i];
return total;
}
2、数组引用
int marbles[20]={1,2,3,4,5,6,7,8,9,10,......};//数组初始化
total=sum(marbles);//数组名为数组首地址,传递给sum函数
sum函数定义:
int sum(int pt[]){
int total=0;
for(int i=0;i<20;i++)
total+=pt[i];
return total;
}
例程:(注意函数定义及内部求和方法,见注释)
#include <stdio.h>
#define SIZE 10
int sum(int * ar, int n);int sum(int ar[], int n);
int main(void)
{
int marbles[SIZE] = { 20,10,5,39,4,16,19,26,31,20 };
long answer;
answer = sum(marbles, SIZE);
printf("The total number of marbles is %ld.\n", answer);
printf("The size of marbles is %zd bytes.\n",
sizeof marbles);
getchar();
return 0;
}
int sum(int * ar, int n) // int sum(int ar[], int n)
{
int i;
int total = 0;
for (i = 0; i < n; i++)
total += *(ar+i);total += ar[i];
printf("The size of ar is %zd bytes.\n", sizeof ar);
return total;
}
指针形参
例子:
书本错误
例子:
#include <stdio.h>
int data[2] = { 100, 200 };
int moredata[2] = { 300, 400 };
int main(void)
{
int * p1, *p2, *p3;
p1 = p2 = data;
p3 = moredata;
printf(" *p1 = %d, *p2 = %d, *p3 = %d\n",
*p1, *p2, *p3);
printf("*p1++ = %d, *++p2 = %d, (*p3)++ = %d\n",
*p1++, *++p2, (*p3)++);
printf(" *p1 = %d, *p2 = %d, *p3 = %d\n",
*p1, *p2, *p3);
getchar();
return 0;
}
指针操作
int * a;int * b;
int i;
int m[10];
指针变量的8种基本操作:
1、赋值:a=m; 数组名、a=&i;地址运算符&、a=b;指针赋值(同类型)
2、解引用:i=*b;
3、取址:a=&a;指针变量也有自己的地址和值。
4、指针和整数相加:a=m;a=a+2;//相当于m[2]的地址。(注意范围)
5、递增指针:a=m;a++;因为int为4字节(根据系统不定),a+1相当于当前a地址后移4个字节(注意范围)
6、指针减去一个整数:(注意范围)
7、递减指针:(注意范围)
8、指针求差:a=m;b=m+5;a-b就为两个元素m[0]与m[5]之间的距离,相隔5个int,5x4字节。
9、比较:a=m;b=m+5;while(a<b){ }前提是两个指针都指向相同类型的对象。
不要解引用未初始化的指针!!!!!
指针的基本用法:
第一种用法:见第九章
第二种用法:见第十章(本章)。
使用const
1、不能修改数组中的数据:
指针和多维数组
增加数组维数会增加指针的复杂度。
多维数组越多,解引用越多。对二维数组名解引用两次才能得到储存在数组中的值。
#include <stdio.h>
int main(void)
{
int zippo[4][2] = { { 2,4 },{ 6,8 },{ 1,3 },{ 5, 7 } };
printf(" zippo = %p, zippo + 1 = %p\n",
zippo, zippo + 1);
printf("zippo[0] = %p, zippo[0] + 1 = %p\n",
zippo[0], zippo[0] + 1);
printf(" *zippo = %p, *zippo + 1 = %p\n",
*zippo, *zippo + 1);
printf("zippo[0][0] = %d\n", zippo[0][0]);
printf(" *zippo[0] = %d\n", *zippo[0]);
printf(" **zippo = %d\n", **zippo);
printf(" zippo[2][1] = %d\n", zippo[2][1]);
printf("*(*(zippo+2) + 1) = %d\n", *(*(zippo + 2) + 1));
getchar();
return 0;
}
指向多维数组的指针
指针兼容性
int (* pa)[3];//pa指向一个内含3个int类型数值的数组。(列数)
2020-01-31 星期五
例子
#include <stdio.h>
#define ROWS 3
#define COLS 4
void sum_rows(int ar[][COLS], int rows);
void sum_cols(int[][COLS], int); // ok to omit names
int sum2d(int(*ar)[COLS], int rows); // another syntax int sum2d(int ar[][COLS], int rows);
int main(void)
{
int junk[ROWS][COLS] = {
{ 2,4,6,8 },
{ 3,5,7,9 },
{ 12,10,8,6 }
};
sum_rows(junk, ROWS);
sum_cols(junk, ROWS);
printf("Sum of all elements = %d\n", sum2d(junk, ROWS));
getchar();
return 0;
}
void sum_rows(int ar[][COLS], int rows)
{
int r;
int c;
int tot;
for (r = 0; r < rows; r++)
{
tot = 0;
for (c = 0; c < COLS; c++)
tot += ar[r][c];
printf("row %d: sum = %d\n", r, tot);
}
}
void sum_cols(int ar[][COLS], int rows)
{
int r;
int c;
int tot;
for (c = 0; c < COLS; c++)
{
tot = 0;
for (r = 0; r < rows; r++)
tot += ar[r][c];
printf("col %d: sum = %d\n", c, tot);
}
}
int sum2d(int ar[][COLS], int rows)
{
int r;
int c;
int tot = 0;
for (r = 0; r < rows; r++)
for (c = 0; c < COLS; c++)
tot += ar[r][c];tot += *(*(ar + r) + c);
return tot;
}
tot += ar[r][c];等价于tot += *(*(ar + r) + c);
int sum2d(int(*ar)[COLS], int rows);等价于int sum2d(int ar[][COLS], int rows);
//数组名junk是指向数组首元素的指针,首元素是子数组。
变长数组
int sum2d(int a,int b,int ar[a][b]);
vs 例程没成功(自己没成功)
复合字面量
vs 例程没成功(自己没成功)
本章小结:
2020-02-01 疫情中。祝大家平平安安,顺顺利利!!!!
从键盘读取数组 scanf_s
scanf_s与getchar区别见第八章
void get_num(double ar[][COLS], int rows)
{
int r, c;
double a = 1.0; //是为了让编译器链接浮点链接库
printf("Please enter 3 groups of numbers, and there\n"
"are 5 numbers in each group:\n");
for (r = 0; r < rows; r++)
for (c = 0; c < COLS; c++)
scanf_s("%lf", &ar[r][c]);
getchar();
}
2020-03-27 大连