Coursera课程笔记----C程序设计进阶----Week 5
指针(二) (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⬇️
 
 
- 二维数组a[3][4]包含3个元素:a[0],a[1],a[2]
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的更多相关文章
- Coursera课程笔记----C程序设计进阶----Week 4
		指针(一) (Week 4) 什么是"指针" 互联网上的资源--地址 当获得一个地址,就能得到该地址对应的资源,所以可以把"网址"称为指向资源的"指针 ... 
- Coursera课程笔记----C程序设计进阶----Week 3
		函数的递归(Week 3) 什么是递归 引入 函数可以嵌套调用:无论嵌套多少层,原理都一样 函数不能嵌套定义:不能在一个函数里再定义另一个函数,因为所有函数一律平等 问题:一个函数能调用它自己吗? 举 ... 
- Coursera课程笔记----C程序设计进阶----Week 1&2
		C程序中的函数(Week 1&2) 函数 函数的定义 对函数的普遍认识:y=f(x) C语言中的常用函数: 平方根: r = sqrt(100.0) 底数x的y次幂:k = pow(x,y) ... 
- Coursera课程笔记----C++程序设计----Week3
		类和对象(Week 3) 内联成员函数和重载成员函数 内联成员函数 inline + 成员函数 整个函数题出现在类定义内部 class B{ inline void func1(); //方式1 vo ... 
- 操作系统学习笔记----进程/线程模型----Coursera课程笔记
		操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进 ... 
- Coursera课程笔记----Write Professional Emails in English----Week 3
		Introduction and Announcement Emails (Week 3) Overview of Introduction & Announcement Emails Bas ... 
- 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 ... 
- Coursera课程笔记----计算导论与C语言基础----Week 6
		理性认识C程序 导论(Week 6) 明确学习进度 讲课内容 感性➡️理性➡️函数➡️指针等 作业练习 初级阶段 ➡️正常作业练习 C语言的由来 程序设计语言的分类 低级语言之机器语言 0010101 ... 
- Coursera课程笔记----计算导论与C语言基础----Week 4
		感性认识计算机程序(Week 4) 引入 编程序 = 给计算机设计好运行步骤 程序 = 人们用来告诉计算机应该做什么的东西 问题➡️该告诉计算机什么?用什么形式告诉? 如果要创造一门"程序设 ... 
随机推荐
- 初识指令重排序,Java 中的锁
			本文是作者原创,版权归作者所有.若要转载,请注明出处.本文只贴我觉得比较重要的源码 指令重排序 Java语言规范JVM线程内部维持顺序化语义,即只要程序的最终结果与它顺序化情况的结果相等,那么指令的执 ... 
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(八)之Reusing Classes
			The trick is to use the classes without soiling the existing code. 1. composition--simply create obj ... 
- Python-selenium安装与Java-selenium安装
			一.Python安装及selenium的安装 1.安装Pythonhttps://www.Python.org2.安装setuptools.distribute.piphttps://pypi.pyt ... 
- C - Trailing Zeroes (III)  二分
			You task is to find minimal natural number N, so that N! contains exactly Q zeroes on the trail in d ... 
- python操作数据库-SQLSERVER-pyodbc
			刚开始学python时,大家都习惯用pymssql去读写SQLSERVER.但是实际使用过程中,pymssql的读写性能以及可靠性的确不如pyodbc来的好. 正如微软官方推荐使用pyodbc库,作为 ... 
- SQL入门,就这么简单
			随着时代的发展,人类活动产生的信息越来越多,大家常说,现在这个时代是大数据时代.在这样一个前提下,数据的存储成为我们必须要认真对待和研究的问题了.SQL(Structured Query Langua ... 
- 使用 selenium 实现谷歌以图搜图爬虫
			使用selenium实现谷歌以图搜图 实现思路 原理非常简单,就是利用selenium去操作浏览器,获取到想要的链接,然后进行图片的下载,和一般的爬虫无异. 用到的技术:multiprocessing ... 
- django基础(一) - 安装和配置文件
			django介绍 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型M,视图V和控制器C. <div style='color: red'> ... 
- Java中基础类基础方法(学生类)(手机类)
			学生类: //这是我的学生类class Student { //定义变量 //姓名 String name; //null //年龄 int age; //0 //地址 String address; ... 
- Ubuntu安装Python3.8及新特性
			Ubuntu安装Python3.8.0a4 如果你想体验一下,请用虚拟机(感受一下就行,别当真). 新特性(整体来说,有三点特别需要注意一下) 海象运算符 # python3.7 a = '123' ... 
