C primer plus自用知识点整理(第十章)数组和指针

书籍整理内容:
最近在看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 大连

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值