和指针相关的问题口诀1:

1. 地址变量得地址,得谁地址指向谁

和指针相关的问题要画图: 内容变量画房子,指针画箭头

---->口

----------------------------------------------------

和指针相关的两个特殊运算符:

一、"&" 取地址运算符,通过&运算符可以取出普通变量的地址;

二、"*"  有两种意义:

1.  为指针标志: 是否为指针标志主要看前面是否有类型,此处有一个int

2.  为指针运算符:

在等号右面为取值。*可以取出指针变量所指向的普通变量的值。

在等号左面为赋值。*可以将指针变量所指向的普通变量的值,修改为其他。

口诀2: 有* 为内容值,不是读就是写。等号左面为赋值, 其余都为取值。

3.  为乘法运算符。当且仅当左右的都为变量时。略。

int a, b =20, c=30, d=40, *p; (正确,此处的*为指针标志,只起到定义的左右,没有取值和赋值的作用。是否为指针标志主要看前面是否有类型,此处最前面有一个int)

p=&d; (正确,p指向d的地址)

a=*p;  (正确,此处的*为取值。最后结果a的值变为了d的值40)

*p =c; (正确,此处的*为赋值。最后结果d的值变为了C的值30)

*p =&b; (运行错误,左边为内容值,右边为地址,不等价)

--------------------------------------------------------

和指针相关的等价表达式

若指针变量p指向变量a,即将变量a的地址赋给了指针变量p.

如:int a=20, int *p=&a;

则有如下结果:

A、*p <=> a

B、 p <=> &a

C、 &*p <=> &a <=> p

D、*&a <=> *p <=> a

E、 (*p)++  a++

(*p)--  a--

++(*p)  ++a   ++*p

--(*p)  --a   --*p

可以看出 * 和 & 是互逆的两个运算符

--------------------------------------------------------

所有的指针变量在内存中分配的字节数相同 sizeof(指针) 永远是 两个字节, 不管指针定义时是 int *, float * 还是 double * . 详细如下

int *p1;   则 p1以后必须指向int 类型的变量。   但指针本身的长度,sizeof(p1) 为2个字节(2*8bit -16bit)

float *p2;   则 p2以后必须指向float 类型的变量。   但指针本身的长度,sizeof(p2) 为2个字节(2*8bit -16bit)

double *p3;   则 p3以后必须指向double 类型的变量。   但指针本身的长度,sizeof(p3) 为2个字节(2*8bit -16bit)

-----------------------------------------------------------

四道例题:

例子1.

void fun (int *x , int *y) {

printf("%d, %d", *x, *y) ;

*x = 3;

*y = 4;

}

main()

{

int x = 1, y = 2

fun(&y, &x);

printf("%d, %d", x, y);

}

结果

2, 1

4, 3

注意main在调用fun函数时, y 和x故意写颠倒了。

--------------------------------------------------------------

例子2.

#include

void swap(int *p1, int *p2)

{

int temp;

temp = *p1;

*p1 = *p2;

*p2 = temp;

}

main()

{

int a, b;

int * p1 = &a, *p2 = &b;

scanf(%d %d, p1, p2);

swap(p1, p2);

prinf("%d, %d", *p1, *p2);

}

如果在控制台输入2 和 5

则输出结果为

5, 2

原因: 在调用swap函数时使用了职称,所以在swap函数内部对p1,p2 所引用的内容值的修改,会影响外面的a和b的值。

--------------------------------------------------------------

例子3:

#include

void swap(int *p1, int *p2)

{

int *temp;

temp = p1;

p1 = p2;

p2 = temp;

}

main()

{

int a, b;

int * p1 = &a, *p2 = &b;

scanf(%d %d, p1, p2);

swap(p1, p2);

prinf("%d, %d", *p1, *p2);

}

和2不同, swap函数中的temp为指针,temp=p1使得temp指向了2,p1=p2使得p1指向了5,p2=temp使得p2指向了5.

但最后的打印结果仍为

2,5

原因是:虽然main中调用swap函数时使用了指针传递,但swap函数中的所有操作都是:将指针本身的修改,而没有再次使用*操作符来修改“指针指向的内容值”

口诀3:没有*的指针操作为地址,地址的赋值意味着改指向。

---------------------------------------------------------------------

例子4:

#include

void swap(int *p1, int *p2)

{

int *temp;

*temp = *p1;

*p1 = *p2;

*p2 = *temp;

}

main()

{

int a, b;

int * p1 = &a, *p2 = &b;

scanf(%d %d, p1, p2);

swap(p1, p2);

prinf("%d, %d", *p1, *p2);

}

和2很像。但唯一不同是,temp定义为指针而不是普通变量。看上去似乎应该和2的输出结果一样,仍为

2,5 。

但实际运行时编译器会报错:非法的内存写入。

原因是:temp为野指针,并没有预订指向哪里。如果指向系统区,则可能导致操作系统死机或崩溃。

如果temp在定义后,马上给一个初始值,就不会有问题了。

---------------------------------------------------------------------

指针、数组的等价符号

若将数组作为形参,则将数组名作为指针变量来处理。

int fun(int a[10]) <=> int fun(int *a) <=> int fun(int a[])

可以看出,口诀4:  &与*互逆。 *与[]等价, &与[]互逆

例子5:

int s[10], a, b;

in d[3][6];

int *p;

p=&a; //p 指向了整数a

p = &s[2]; //p指向了s数组的第二个元素

p= &d[2][4];p指向了d数组的第二行、第四列的元素。

所以,以上的语句都是对的。

上面的例子:

1. 定义了一个int s[10];   则 s等同于 &s[0].   即,看到一个数组,就马上联想到他代表的是数组第一个元素的地址。

在C语言中规定,数据名代表数组的首地址,并且是一个地址常量

2. 另外,如果定义了一个指针 int *ppp = s;  则   ppp 定价于s,  同时等价于 &s[0]。

---------------------------------------------------------------------

指针的加减:

当指针变量指向数组中的某一个地址时,指针变量加1后指向数组的下一个元素,

指针变量减1时指向数组的前一个元素。

例子6:

float a[10]; float *p;

p=&a[4]; 则p-3指向?

先画图:

a[0] | a[1] | a[2] | a[3] | a[4] | ...

p的初始位置指向了 a[4],  则 p-3 为向前3个,指向了 a[1]

口诀5:  指针的加减是向前或向后移动了n个元素

---------------------------------------------------------------------

int a[N], *p=a;

则有:

地址三等价:

存在等价表达式:

p+i <=> a+i <=> &a[i]  代表的是第i个元素的地址

元素四等价:

存在等价表达式:

1.   *(p+i) <=> *(a+i) <=> a[i]   代表的是第i个元素的值

2.  另外,还有 p[i] <=> a[i] 。 p[i] 的用法不多见,但无任何错误,代表的也是第i个元素的值。原因是p和a完全等价。

整理出来的等价式如下:

a) *(p+i) <=> *(a+i) <=> a[i] <=> p[i]

b) p++ <=> ++p <=>  p+=1 <=>  p=p+1

c) p-- <=>  --p  <=>  p-=1  <=>  p=p-1

d) *p++  <=>   *(p++)

说明:* 与 ++ 的运算优先级一样,所以按照从右到左的结合原则,先执行++,后执行*

++在p的后面,为执行后再加。即先把p的值取出,指针再加1.

e) *++p  <=>  *(++p)

++在p的前面,为先加再执行。即先把指针加1, 再把移动后的p所指向的值取出,

f) (*p)++ <=>   ++(*p)  <=>   ++*p

将p的内容自增

g) (*p)--  <=>  --(*p)  <=>   --*p

将p的内容自减

c语言指针数组 难点总结,C语言之指针与数组总结相关推荐

  1. c语言指针数组 难点总结,C语言指针与数组的难点分析.pdf

    C语言指针与数组的难点分析,c语言指针数组,c语言二维数组指针,c语言指针数组初始化,c语言函数指针数组,c语言数组与指针,c语言结构体数组指针,c语言指向数组的指针,c语言字符串数组指针,c语言数组 ...

  2. 出参传递数组指针_C语言指针重难点详解

    1为什么使用指针 假如我们定义了 char a='A' ,当需要使用 'A' 时,除了直接调用变量 a ,还可以定义 char *p=&a ,调用 a 的地址,即指向 a 的指针 p ,变量 ...

  3. linux c语言 malloc动态分配指针,C语言malloc函数为一维,二维,三维数组分配空间...

    c语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放,这些数据存储在堆区.可以根据需要,向系统申请 ...

  4. c++如何打印一维数组首地址_C语言之二维数组和指针的结合

    最近在练习 C 语言计算机二级的程序设计题,碰到了二维数组和指针的结合,当时怎么调试都不对,自己也记不清楚该怎么用了就跑去看书翻资料重新复习.自己纠结的问题是二维数组 int a[3][4]的数组名是 ...

  5. c语言数组与指针的基础知识,C语言学习笔记之数组与指针的关系

    首先,大家先需知道一个关于基类型的概念 基类型:组成一个新类型的基础类型 这句话是什么意思呢?举个例子: int a[3] = {1,2,3}; 上面是由三个int类型的数组成一个新的类型也就是数组, ...

  6. 【C语言进阶深度学习记录】三十 二维数组与二维指针

    文章目录 1 二维指针(指向指针的指针) 2 二维数组 3 二维数组的类型 3.2 如何动态申请二维数组 4 总结 1 二维指针(指向指针的指针) 指针的本质是变量 指针的指针是保存指针变量的地址.如 ...

  7. C语言指针实数组输入输出,C语言:回来两个数组中第一个元素的指针,并输出这个值...

    C语言:返回两个数组中第一个元素的指针,并输出这个值 // //  main.c //  Pointer_search // //  Created by ma c on 15/8/2. //  Co ...

  8. c语言指针查找数组一个数_C语言快速入门——指针与数组

    与数组有关的地址 我本来打算以一个程序开始,让我们直接理解相关概念.但转念一想,如果引导你思考问题而得出结论,或许会有另一种效果,因此,我们的讨论以下面的定义为基础. int a = 9;int b[ ...

  9. C语言中指针与数组的区别,C语言 指针与数组的详解及区别

    C语言 指针与数组的详解及对比 通俗理解数组指针和指针数组 数组指针: eg:int( *arr)[10]; 数组指针通俗理解就是这个数组作为指针,指向某一个变量. 指针数组: eg:int*arr[ ...

最新文章

  1. 如何用JNI技术提高Java的性能详解
  2. Python如何实现24个微信大群万人同步转发直播?
  3. Lightroom学习随笔
  4. hive提供oracle接口嘛,Hive是个什么东东
  5. css禁用选中文本_使用CSS禁用文本选择突出显示
  6. 动态规划——最嘉观光组合(Leetcode 1014)
  7. 计算机网络学习笔记(22. Web应用概述)
  8. 23种设计模式(十二)对象性能之享元模式
  9. 酷狗php 技术题目,广州酷狗php面试题(赋答案)
  10. 趋势科技防毒墙网络版—OfficeScan
  11. Mars《Android开发视频教程》
  12. 【钢结构·技术】国内经典的钢结构建筑BIM应用
  13. wifip2p重连 android,Android Wifi实现分析
  14. Bart模型应用实例及解析(一)————基于波士顿房价数据集的回归模型
  15. 一、区块链技术与应用-密码学原理
  16. matlab通过变量调用txt文件路径,MATLAB使用load函数读取txt文档
  17. 秦曾昌人工智能课程---4、梯度下降算法
  18. 成为黑客需要学习什么技能?
  19. 哪款蓝牙耳机性价比最高?几款大热门蓝牙耳机实测
  20. 小程序云开发之消息推送功能

热门文章

  1. SAP TableControl 控制单个单元格输入
  2. 批量生成销售订单、退货订单
  3. SAP MIR7输入数量自动金额的设置
  4. 小企业“银行存款”科目的核算内容包括哪些?
  5. 路由怎么定位到当前页面的组件_Angular 重载当前路由
  6. 基于c#的相关性分析_开源Math.NET基础数学类库使用(11)C#计算相关系数
  7. 数控加工编程计算机的配置,计算机辅助数控加工编程.ppt
  8. python函数教程:global 和 nonlocal的详细用法
  9. Python中str、list、numpy分片操作
  10. 三星.android beam,三星S Beam取代Android Beam