C语言-再论指针与数组
指针与数组的天生姻缘
1、以指针方式来访问数组元素
(1)、数组元素使用时不能整体访问,只能是单个访问。访问形式有两种:数组形式和指针形式。
(2)、数组形式访问数组元素:数组名[下标];(下标从0开始
(3)、指针格式访问数组元素:*(指针+偏移量);
(4)、数组下标方式和指针方式均可以访问数组元素,两者的实质是一样的。在编译器内部都是用指针方式来访问数组的,
数组下标方式只是编译器给编程者提供了一种壳而已。所以用指针方式来访问数组才是本质的做法。
2、从内存角度理解指针访问数组的实质
(1)、数组的特点就是:数组中各个元素的地址是依次相连的,而且数组还有一个很大的特点就是数组中各个元素的类型
比较相同。类型相同就决定了每个数组元素占几个字节是相同的。
(2)、数组中的元素其实就是地址相连接、占地大小相同的一串内存空间。
这两个特点就决定了只要知道数组中一个元素的地址,就可以很容易推算出其他元素的地址。
3、指针与数组类型的匹配问题
(1)、int *p; int a[5]; p = a; //类型匹配,a做右值等同于&a[0];
(2)、int *p; int a[5]; p = &a; //类型不匹配,p是int *,&a是整个数组的指针,也就是一个数组指针类型,不是
int指针类型,所以不匹配。
(3)、&a、a、&a[0]从数值上看是完全相等的,但是从意义上看就不同了。从意义上看,a和&a[0]是数组首元素首地址,
而&a是整个数组的首地址;从类型上看,a和&a[0]是元素的指针,也就是int * 类型的;而&a是数组指针,是int (*)[5];类型。
4、总结:指针类型决定了指针如何参与运算
(1)、指针参与运算时,因为指针变量本身存储的数值是表示地址的,所以运算也是地址的运算。
(2)、指针参与运算的特点就是:指针变量+1,并不是真的加1,而是加1*sizeof(指针类型);如果是int *类型,则+1就
实际表示地址+4,如果是char *指针,则+1就表示地址+1;如果是double *指针,则+1就表示地址+8.
#include <stdio.h> int main(void)
{ int a[] = {,,,,};
printf("a[3] = %d.\n",a[]); //打印出结果是4
printf("*(a+3) = %d.\n",*(a+)); //打印出结果是4;a在这里做右值,相当于
//一个地址,a+3相当于地址加3
//所以就相当于 int *p; p = a + 3; printf出*p;
return ;
}
C语言-再论指针与数组的更多相关文章
- 深入理解C语言中的指针与数组之指针篇
转载于http://blog.csdn.net/hinyunsin/article/details/6662851 前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...
- 深入理解C语言中的指针与数组之指针篇(转载)
前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ...
- c语言学习笔记 - 指针和数组
结合内存存储数据的机制,c语言里指针的出现和使用也就不奇怪了,如果先学了内存的一些知识,以及程序运行机制,到了c指针这块就会清晰很多. #include <stdio.h> int mai ...
- C语言中的指针和数组
下面的内容节选自由我所执笔的会议记录.对于本文的不足之处,各位可以提出自己的看法. Q1:指针和数组到底是怎么一回事? A:指针和数组有本质的不同.指针就是一个内存地址,在32位系统下,一个指针永远占 ...
- C语言学习笔记--指针和数组的关系
1.数组的本质 (1)数组是一段连续的内存空间 (2)数组的空间大小:sizeof(array_type)*array_size; (3)数组名可看做指向数组第一个元素的常量指针 (4)数组声明时编译 ...
- C语言中的指针与数组的定义与使用
指针的特点 他就是内存中的一个地址 指针本身运算 指针所指向的内容是可以操作的 操作系统是如何管理内存的 栈空间 4M~8m的大小 当进入函数的时候会进行压栈数据 堆空间 4g的大小 1g是操作系统 ...
- C语言:通过指针对数组元素进行排序
// // main.c // Pointer_array // // Created by ma c on 15/8/2. // Copyright (c) 2015年 bjsxt. All ...
- c语言冒泡排序,指针,数组
冒泡排序算法的运作如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复 ...
- c语言实现字符指针(字符串)数组的排序
需求: "ff555d", "114ddd", "114dd","aaa", "aaab", &qu ...
随机推荐
- netty权威指南学习笔记一——NIO入门(4)AIO
NIO2.0引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现.异步通道提供以下两种方式获取操作结果. 1.通过java.util.concurrent.Future 类来表示异步操 ...
- cf 782# A.Andryusha and Socks B.The Meeting Place Cannot Be Changed C.Andryusha and Colored Balloons
看来快掉到灰名的蒟蒻涨rating也快... A题模拟一下就好(一开始还sb,, #include<bits/stdc++.h> #define LL long long using na ...
- BZOJ 4853 [Jsoi2016]飞机调度
题解: 我严重怀疑语文水平(自己的和出题人的) 把航线按照拓扑关系建立DAG 然后最小路径覆盖 为什么两条首尾相接航线之间不用维护???? #include<iostream> #incl ...
- 036-PHP闭包函数的域限制,与如何向闭包函数传递变量
<?php // 闭包函数的域限制,与如何向闭包函数传递变量 # 隐藏上面的代码,我们最后再来试下 function demo($ATxt) { $func = function () use ...
- SQL Server 语法大全
SQL语句参考,包含Access.MySQL 以及 SQL Server 基础 创建数据库 CREATE DATABASE database-name 删除数据库 drop database dbna ...
- kafka管理神器-kafkamanager
好久没发过kafka的文章了,今天整理一下kafka-manager神器. java环境要求 jdk8 kafkamanager源码下载 https://github.com/yahoo/kafka- ...
- Python LMDB的使用
在python中使用lmdb linux中,可以使用指令 pip install lmdb 安装lmdb包. ---- lmdb 数据库文件生成 增 改 删 查 1.生成一个空的lmdb数据库文件 # ...
- java菜鸡循环练习
While 循环练习 输入3次密码,则打印密码锁定 package com.lv.test; import java.util.Scanner; public class DemoPass { pu ...
- UVA - 11491 Erasing and Winning(奖品的价值)(贪心)
题意:有一个n位整数(不以0开头),要求删除其中的d个数字,使结果尽量大.(1<=d<n<=10^5) 分析: 1.从头扫一遍,如果当前填的数字小于n-d,则将当前数字填上. 2.如 ...
- 转: 十大Intellij IDEA快捷键
Intellij IDEA中有很多快捷键让人爱不释手,stackoverflow上也有一些有趣的讨论.每个人都有自己的最爱,想排出个理想的榜单还真是困难.以前也整理过Intellij的快捷键,这次就按 ...