指针(二) (Week 5)

字符串与指针

  • 指向数组的指针

    • int a[10]; int *p; p = a;
  • 指向字符串的指针
    • 指向字符串的指针变量
    • char a[10]; char *p; p = a;
int main()
{
int a = 5;
int *pa = &a; int b[6] = {1,2,3,4,5,6};
int *pb = b; char c[6] = {'h','e','l','l','o','\0'};
char *pc = c; cout<<a<<endl; //5
cout<<pa<<endl; //a的地址 cout<<b<<endl;//b[0]的地址
cout<<pb<<endl;//b[0]的地址 cout<<c<<endl;//hello
cout<<pc<<endl;//hello //若不想打印字符串内容,就想打印字符串地址
cout<<static_cast<void*>(c)<<endl;
cout<<static_case<void*>(pc)<<endl; return 0;
}
  • 字符串指针举例
#include<iostream>
using namespace std;
int main()
{
char buffer[10] = "ABC";
char *pc;
pc = "hello";//学习指针之前,我们无法直接赋值,只能在定义的时候这样直接赋值
cout<<pc<<endl; //hello
pc++;
cout<<pc<<endl;//ello
cout<<*pc<<endl;//e
pc = buffer;
cout << pc;//ABC
return 0;
}

指向二维数组的指针

再谈一维数组的地址

#include<iostream>
using namespace std;
int main()
{
int a[4] = {1,3,5,7};
cout << a << endl; //a[0]的地址,a为指向数组首元素的指针(基类型为int)
cout << a + 1 << endl;//a[1]的地址
cout << &a << endl;//a[0]的地址,但相当于指向整个数组的指针(基类型为int[4])
cout << &a + 1 << endl;//a[3]之后的地址(越界了)
cout << *(&a) << endl;//*E,E若为指针,*E将返回E指向的内容,所以返回a[0]的地址,和打印a的结果相同
cout << *(&a)+1 << endl;//a[1]的地址
return 0;
}
  • 数组名相当于指向数组的第一个元素的指针
  • 若a是指向数组的第一个元素的指针,即a相当于&a[0]
    • &a是“指向数组”的指针, &a+1将跨越16个字节
    • &a相当于管辖范围“上升”了一级
    • *a是数组的第一个元素a[0],即*a等价于a[0]
    • *a相当于管辖范围“下降”了一级

指向二维数组的指针

  • 二维数组的定义

    • 二维数组a[3][4]包含3个元素:a[0],a[1],a[2]

      • 每个元素都是一个“包含4个整形元素”的数组
    • 二维数组的第一个元素是a[0]
    • a[0]是一个“包含4个整型元素”的一维数组
      • a为指向a[0]这个一维数组的指针
      • a[0]为指向第一个元素a[0][0]的指针
      • 管辖范围排序:&a>a>a[0]>a[0][0](连指针都不是,只是个量)
        • a = &a[0]
        • a[0] = &a[0][0]
        • a[0] = *a
        • a[0][0] = **a
    • 三条规律
      • 数组名相当于指向数组第一个元素的指针
      • &E相当于E⬆️
      • *E相当于E⬇️
int main()
{
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; cout<<" a ="<<a<<endl;
cout<<" &a[0] ="<<&a[0]<<endl<<endl; cout<<" a+1 ="<<a+1<<endl;
cout<<" &a[0]+1 ="<<&a[0]+1<<endl<<endl; cout<<" *a ="<<*a<<endl;
cout<<" a[0] ="<<a[0]<<endl;
cout<<" &a[0][0] ="<<&a[0][0]<<endl<<endl; cout<<" *a+1 ="<<*a+1<<endl;
cout<<" a[0]+1 ="<<a[0]+1<<endl;
cout<<" &a[0][0]+1 ="<<&a[0][0]+1<<endl<<endl; ... return 0;
}

编程作业

Quiz1 计算矩阵边缘元素之和

#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
for (int i = 0; i < n; i++) {
int a,b;
cin >> a >> b;
int matrix[101][101];
int summer = 0;
for (int j = 0; j < a; j++) {
for (int k = 0; k < b; k++) {
cin >> matrix[j][k];
if(j == 0 || j == a-1 || k == 0 || k == b-1)
summer += matrix[j][k];
}
}
cout << summer << endl;
} return 0;
}

Quiz2 二维数组右上左下遍历

#include <iostream>
using namespace std;
int main()
{
int row, col;
cin >> row >> col;
int shuzu[100][100];
for (int j = 0; j < row; j++) {
for (int o = 0; o < col; o++) {
cin >> shuzu[j][o];
}
}//row 行 col 列
int k = col + row - 1;//共有(行数+列数-1)条对角线
for (int i = 0; i <= k; ++i) {//对每一条对角线进行处理
cout<<"i = "<<i<<endl;
int c = i - 1;//对角线行数列数起始点为0,每次+1;所以,刚好起始点横坐标是对角线编号-1
for (int r = 0; r < row; r++) //同理
{
if (r >= 0 && r < row && c < col && c >= 0) {//通过这个,找到在范围内的。
cout << *(*(shuzu + r) + c) << endl;//只打印在范围内的
}
c--;//因为是由右边到左边,所以C--
} }
return 0;
}
//要想象到"画面外的虚线"

Quiz3 文字排版

#include <string>
using namespace std;
int main()
{
int n;
cin >> n;
string text;
int flag = 80;
for (int i = 0; i < n; i++) {
string temp;
cin >> temp;
if(flag > temp.length())
{
text = text.append(temp);
text = text.append(" ");
flag -= (temp.length()+1);
} else if (flag == temp.length()){
text = text.append(temp);
text = text.append("\n");
flag = 80;
} else{
text = text.append("\n");
flag = 80;
text = text.append(temp);
text = text.append(" ");
flag -= (temp.length()+1);
}
} cout<<text<<endl;
}
//这道题我是用string解决的……感觉比较方便

Coursera课程笔记----C程序设计进阶----Week 5的更多相关文章

  1. Coursera课程笔记----C程序设计进阶----Week 4

    指针(一) (Week 4) 什么是"指针" 互联网上的资源--地址 当获得一个地址,就能得到该地址对应的资源,所以可以把"网址"称为指向资源的"指针 ...

  2. Coursera课程笔记----C程序设计进阶----Week 3

    函数的递归(Week 3) 什么是递归 引入 函数可以嵌套调用:无论嵌套多少层,原理都一样 函数不能嵌套定义:不能在一个函数里再定义另一个函数,因为所有函数一律平等 问题:一个函数能调用它自己吗? 举 ...

  3. Coursera课程笔记----C程序设计进阶----Week 1&2

    C程序中的函数(Week 1&2) 函数 函数的定义 对函数的普遍认识:y=f(x) C语言中的常用函数: 平方根: r = sqrt(100.0) 底数x的y次幂:k = pow(x,y) ...

  4. Coursera课程笔记----C++程序设计----Week3

    类和对象(Week 3) 内联成员函数和重载成员函数 内联成员函数 inline + 成员函数 整个函数题出现在类定义内部 class B{ inline void func1(); //方式1 vo ...

  5. 操作系统学习笔记----进程/线程模型----Coursera课程笔记

    操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进 ...

  6. Coursera课程笔记----Write Professional Emails in English----Week 3

    Introduction and Announcement Emails (Week 3) Overview of Introduction & Announcement Emails Bas ...

  7. Coursera课程笔记----Write Professional Emails in English----Week 1

    Get to Know Basic Email Writing Structures(Week 1) Introduction to Course Email and Editing Basics S ...

  8. Coursera课程笔记----计算导论与C语言基础----Week 6

    理性认识C程序 导论(Week 6) 明确学习进度 讲课内容 感性➡️理性➡️函数➡️指针等 作业练习 初级阶段 ➡️正常作业练习 C语言的由来 程序设计语言的分类 低级语言之机器语言 0010101 ...

  9. Coursera课程笔记----计算导论与C语言基础----Week 4

    感性认识计算机程序(Week 4) 引入 编程序 = 给计算机设计好运行步骤 程序 = 人们用来告诉计算机应该做什么的东西 问题➡️该告诉计算机什么?用什么形式告诉? 如果要创造一门"程序设 ...

随机推荐

  1. 令人迷惑的Gamma

    概述 首先我想说,接触到Gamma的概念也很长时间了,一直没有认真的去学习它.知其然而不知其所以然.最近恰巧学到了这一部分,就想彻底地搞懂它. CRT 说起Gamma,肯定离不开CRT(阴极射线管). ...

  2. 《带你装B,带你飞》pytest修仙之路5 - yield操作

    1. 简介 上一篇中,我们刚刚实现了在每个用例之前执行初始化操作,那么用例执行完之后如需要清除数据(或还原)操作,可以使用 yield 来实现.fixture通过scope参数控制setup级别,既然 ...

  3. E - Max Sum Plus Plus Plus HDU - 1244 (线性区间DP)

    题目大意:  值得注意的一点是题目要求的是这些子段之间的最大整数和.注意和Max Sum Plus Plus这个题目的区别. 题解: 线性区间DP,对每一段考虑取或者不取.定义状态dp[i][j]指的 ...

  4. C - Infinite Fence -1260C

    考虑区间长度,我们让r和b除以他们的__gcd这样,这样得到的r和b是互质或者相等的.我们取他们两个小的那个.假设是b.那么被涂的方块应该是b,2b,3b,4b,....kb. 相邻的两个方块之间的区 ...

  5. Celery实现周期任务

    这个翻译之后居然叫芹菜~~最近Django框架需要涉及到执行周期任务~~上网搜了下其实还挺多的(django_crontab:这个学习周期短,但是发现不仅麻烦还不好用啊).(apscheduler,简 ...

  6. Python中Selenium模拟JQuery滑动解锁实例

    滑动解锁一直做UI自动化的难点之一,我补一篇滑动解锁的例子,希望能给初做Web UI自动化测试的同学一些思路. 首先先看个例子. https://www.helloweba.com/demo/2017 ...

  7. JavaScript思维导图很全(W3C上的!!!!很重要快来看!)

  8. 基于scrapy框架输入关键字爬取有关贴吧帖子

    基于scrapy框架输入关键字爬取有关贴吧帖子 站点分析 首先进入一个贴吧,要想达到输入关键词爬取爬取指定贴吧,必然需要利用搜索引擎 点进看到有四种搜索方式,分别试一次,观察url变化 我们得知: 搜 ...

  9. 适合新手练习的Python项目有哪些?Python爬虫用什么框架比较好?

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. Python爬虫一般用什么框架比较好?一般来讲,只有在遇到比较大型的需求时 ...

  10. SpringMVC视图解析中的 forward: 与 redirect: 前缀

    在 SpringMVC 中,可以指定画面的跳转方式.使用 forward: 前缀实现请求转发跳转,使用 redirect: 前缀实现重定向跳转.有前缀的转发和重定向操作和配置的视图解析器没有关系,视图 ...