=============================================================================

指针变量之间赋值是需要兼容的。

例如:
int *a = int的地址
char *b= char的地址
--------------------------------------
void类型的指针可以做任意类型地址的赋值操作。
例如:
void *p = int地址可以
p = char地址也还可以

但void类型的指针不能做指针运算。
例如:
p++; //会出现问题
--------------------------------------
指针与数组的关系
int a[10];
int *p = a;   //初始化的时候就指向了首地址,相当于int *p = &a[0]; 也相当于int *p; p = a; 也相当于int *p; p = &a[0];
p[3] = 8;    //等价于*(p + 3) = 8;该p[3]对应的是下标为3的元素。

p += 2;      //指针进行运算后
p[3] = 0;   //此时的p[3]对应的元素为下标为5的元素。

a += 2;     //这样写是错误的,因为数组名是一个地址的编号,是一个常量(该常量的解释是:变化的常量。因为每一次运行程序时,地址编号都会发生变化,所以是变化的;又因为一旦程序运行了,那么地址的编号就随之确定了,不能改变了,所以就是常量了!)

p = a + 2;   //因为int *p; p = a; 所以p += 2; --> p = p + 2; --> p = a + 2;  //又因为a是一个地址编号,是一个常量,可以做右值的。
--------------------------------------
指针的运算:指针的加减不是普通整数的加减

例如:
int ab[10];
short *p = ab;    //一个short类型的指针变量,指向了一个int型的地址,但不影响p本身的类型。
p += 2;      //p在内存中移动了4个字节, 结果是移动到了ab[1]的地址了。
int *p1 = ab;
p1 += 2;        //p在内存中移动了8个字节,移动到了ab[2]的地址了。

short abc[10];
p1 = abc;
p1 += 3;       //这时p1移动了12个字节。

指针运算的时候,不要在意指针具体指向一个什么样类型的地址,要在意的是指针本身是什么样的类型。
--------------------------------------
指针数组:main函数的参数就是一个典型的指针数组(也即二级指针)。

int *a[10];    //定义了一个数组,名字叫a,有10个成员,每个成员的类型是int *,成员分别为a[0]、a[1]、......、a[9]。
char *b[10];      //定义了一个数组,名字叫b,有10个成员,每个成员的类型是char *,成员分别为b[0]、b[1]、......、b[9]。
sizeof(a) = 8 个字节, sizeof(b) = 8 个字节。
--------------------------------------
该定义一个什么类型的指针才能指向指针数组b(char *b[10];)呢?
答:
char **p = b;
p[0]是char *类型。此时p[0] = b[0]; p[1] = b[1]; ...... p[9] = b[9];

若如下这样定义的话,就不兼容:
char *p = b;
此时的p[0]是char类型。
但b[0]本身是什么类型呢?答:b[0]是char *类型。此时 p[0] 不等于 b[0]了。
--------------------------------------
该定义一个什么类型的指针才能指向数组b(char b[10];)呢?
答:
char *p = b;
此时的p[0]是char类型,此时p[0] = b[0]; p[1] = b[1]; ...... p[9] = b[9];
--------------------------------------
指向指针的指针(二级指针)

int *p;
*p是什么类型?答:int类型。

int ***p
*p是什么类型?答:int **类型。
**p是int *类型。
***p是int类型。
--------------------------------------
指针变量作为函数参数
如果想要通过函数内部修改外部是实参的值,就需要给函数的参数传递实参的地址。
--------------------------------------
一维数组名作为函数参数

一维数组名一旦作为函数参数,c语言将数组名解释为一级指针变量。(由数组名(常量)变为指针变量名(变量))
int abc(int a[10])
int abc(int a[])
int abc(int *a)

如果将一个数组作为函数的形参进行传递,那么数组内容可以在被调用的函数内部进行修改,
很多时候,我们不希望这样的事情发生,所以用到const对形参进行修饰。(尽管此种修饰方法没有用!)
int abc(const int a[10])
--------------------------------------
指针 和 字符串
在c语言中,大多数的字符串(字符数组)操作其实就是指针操作。

例如:

 #include <stdio.h>

 int main()
{
char s[] = "hello world";
char *p = s;
p[] = 'a';
*p = 'b'; printf("%s\n", s); //bello world char *c = "hello world";
//c[0] = 'a';//编译没有问题,但运行会出现段错误。因为c指向的是一个常量。 printf("%d\n", *c); //
printf("%d\n", c[]); //
printf("%d\n", c[]); // return ;
}

--------------------------------------
char a[100] = "hello world";   //定义一个数组,有100个char,同时初始化数组成员变量的值。
char *p = a;            //定义一个char *类型的指针p,p指向char类型数组的首元素地址。
char *s = "hello world";       //定义了一个字符串常量,s指向这个常量的首地址。
const char *s = "hello world";  //定义了一个字符串常量,s指向这个常量的首地址。(更严谨的写法)

a[0] = 'a'; //合法的,因为数组a的所有成员都是变量。
s[0] = 'a'; //非法的,因为s指向的是一个常量。
--------------------------------------
char *作为函数的参数

此时函数的参数是字符串。
--------------------------------------
如果函数的参数是一个数组,那么函数内部是不知道这个数组成员数量的,所以函数的形参需要额外再增加一个参数,说明数组成员数量。
如果函数的参数是一个字符串(本质是字符数组),那么就不需要增加额外参数说明字符串字符数量了。
--------------------------------------
指针数组作为main函数的参数(即形参)

int main(int a, char *b[10]
int main(int a, char *b[])
int main(int a, char **b)
int main(int argc, char **args)

main函数的第一个参数是标示第二个参数有几个成员,不要尝试修改main函数的参数的顺序。
=============================================================================

c语言基础学习07_关于指针的复习的更多相关文章

  1. Golang 汇编asm语言基础学习

    Golang 汇编asm语言基础学习 一.CPU 基础知识 cpu 内部结构 cpu 内部主要是由寄存器.控制器.运算器和时钟四个部分组成. 寄存器:用来暂时存放指令.数据等对象.它是一个更快的内存. ...

  2. D02-R语言基础学习

    R语言基础学习——D02 20190423内容纲要: 1.前言 2.向量操作 (1)常规操作 (2)不定长向量计算 (3)序列 (4)向量的删除与保留 3.列表详解 (1)列表的索引 (2)列表得元素 ...

  3. D01-R语言基础学习

    R语言基础学习——D01 20190410内容纲要: 1.R的下载与安装 2.R包的安装与使用方法 (1)查看已安装的包 (2)查看是否安装过包 (3)安装包 (4)更新包 3.结果的重用 4.R处理 ...

  4. D03——C语言基础学习PYTHON

    C语言基础学习PYTHON——基础学习D03 20180804内容纲要: 1 函数的基本概念 2 函数的参数 3 函数的全局变量与局部变量 4 函数的返回值 5 递归函数 6 高阶函数 7 匿名函数 ...

  5. D03-R语言基础学习

    R语言基础学习——D03 20190423内容纲要: 1.导入数据 (1)从键盘输入 (2)从文本文件导入 (3)从excel文件导入 2.用户自定义函数   3.R访问MySQL数据库 (1)安装R ...

  6. go语言基础学习

    go基础学习,面向对象-方法在Go语言中,可以给任意自定义类型(包括内置类型,但不包括指针类型)添加相应的方法 使用= 和:=的区别: // = 使用必须使用先var声明例如: var a a=100 ...

  7. C# 语言基础学习路线图

    一直以来,对于很多知识点都是存于收藏夹中,随着时间地变更,收藏夹中链接也起来越多,从未进行整理,也很零散,所以想对曾经遇到并使用过的一些知识形成文档,作为个人知识库的一部分. 就从C# 语言基础开始, ...

  8. 计算机专业C语言编程学习重点:指针化难为易

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  9. C语言基础学习

    汇编语言又叫符号语言 出来机器语言和汇编语言外其他语言必须经过翻译(编译,和解释行)才可以执行 .c --> 编译(翻译成二进制代码 .obj) 链接 把目标程序和库函数以及其他目标程序链接起来 ...

随机推荐

  1. Jstree 使用CheckBox插件 选中父节点时被禁用的子节点也会选中问题

    问题描述: 最近用jstree遇到一个问题,使用CheckBox插件时,当父节点选中时,被禁用的子节点也会选中如下 解决方案: 1.  将jstree升级到最新的版本,v3.3.4及以上就可以 2. ...

  2. [WinForm]委托应用①——窗口之间方法/控件调用

    不传参数 第二窗口:public partial class Form2 : Form { /// <summary> /// 定义委托 /// </summary> publ ...

  3. python访问http的GET/POST

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7562295.html 作者:窗户 Q ...

  4. qt中进程的使用

    qt中的进程使用需要用到头文件:include<QProcess> 首先来看看需要用到的主要的函数 (1)进程的定义: QProcess *mprocess; //定义一个进程参数 (2) ...

  5. Webservice接口的调用

    一.开发webservice接口的方式 1.jdk开发. 2.使用第三方工具开发,如cxf.shiro等等. 我这边介绍jdk方式webservice接口调用. 二.使用jdk调用webservice ...

  6. Android 7.1 WindowManagerService 屏幕旋转流程分析 (三)

    三.屏幕的绘制 performSurfacePlacement()函数来触发window的绘制,这里最大的循环次数是6,当然一般不会到最大次数就会被Scheduled. final void perf ...

  7. CSS3媒体查询(Media Queries)介绍

    媒体类型 all 所有设备 screen 电脑显示器 handheld 便携设备 tv 电视类型设备 print 打印用纸打印预览视图 关键字 and not(排除某种设备) only(限定某种设备) ...

  8. animate.css – 齐全的CSS3动画库

    animate.css – 齐全的CSS3动画库 演 示 下 载   简介 animate.css 是一个来自国外的 CSS3 动画库,它预设了抖动(shake).闪烁(flash).弹跳(bounc ...

  9. 微信语音红包小程序开发如何提高精准度 红包小程序语音识别精准度 微信小程序红包开发语音红包

    公司最近开发的一个微信语音红包,就是前些时间比较火的包你说红包小程序.如何提高识别的精准度呢. 在说精准度之前,先大概说下整个语音识别的开发流程.前面我有文章已经说到过了.具体我就不谈了.一笔带过. ...

  10. 跟我一起,利用bitcms内容管理系统从0到1学习小程序开发:一、IIS下SSL环境搭建

    缘起 1.从事互联网十来年了,一直想把自己的从事开发过程遇到的问题给写出来,分享给大家.可是可是这只是个种想法,想想之后就放下了,写出来的类文章是少之又少.古人说无志之人常立志,有志之人立长志.今天, ...