c数组和指针的理解
#include<stdio.h> int main(void)
{
int a[]={,,,,};
int *p = (int*)(&a + );
printf("%d,%d\n",*a+,*(p-)); // int (*ptr1)[] = &a; √
// int (*ptr2)[] = a; ×
// int (*ptr1)[] = &a; ×
// int (*ptr2)[] = a; ×
} //2,5
数组名只可以作为右值!
当我们定义一个数组时候,编译器根据指定的元素个数和类型确定分配内存大小。并把这一块地址的名称赋为数组名称。
a[0]、a[1]......为数组元素,但并非元素名称!
指针,32系统总是为4字节(0x11111111)只能存放一个地址单元的值,所以总是存放的首地址。
但是访问时候需要根据类型大小来移动指针。
数组名:值等同于数组“首元素”的“首地址”(数组首元素的指针)
P + 1
char*移动一个字节,int*移动4个字节!数组指针移动一个数组元素类型长度!二级指针移动一个指针长度(4)!
&a:表示数组指针(取数组变量a的指针)
对数组的访问,总是转换为对指针的访问!
二维数组
int b[][] = {{,},{,}};
// int *p2 = b; ×
// int (*p5)[2] = b; √
// int **p = b; ×
二维数组名称,指向首元素b[0]的指针,为数组指针【一级指针】!
// int *p3 = b[0]; √
// int (*p4)[2][2] = &b; √
二维数组所有元素的访问(一级指针):
#include<stdio.h>
int main()
{
int iArray[][] = {{,,},{,,}};
int *pArray = NULL; pArray = (int*)iArray; printf("array[0][0] = %d\n", *pArray);
printf("array[1][2] = %d\n", *(pArray + ));
printf("array[1][2] = %d\n", *(pArray + * + )); /*数组本身在地址空间中就是连续排列的*/
printf("array[1][2] = %d\n", *((int *)(*((int (*)[])pArray + )) + ));
return ;
}
二维数组所有元素的访问(数组指针):
#include<stdio.h> int main()
{
int iArray[][] = {{,,},{,,}};
int (*pArray)[] = NULL; pArray = iArray; printf("array[0][0] = %d\n", **pArray);
printf("array[1][2] = %d\n", *(*(pArray+)+));
return ;
}
int main()
{
int iArray[][] = {{,,},{,,}}; int (*pArray)[] = NULL; pArray = iArray; printf("array[0][0] = %d\n", pArray[][]);
printf("array[1][2] = %d\n", pArray[][]);
return ;
}
二级指针
为指向指针的指针,指向的值必须是指针。
int main()
{
int iArray[][] = {{,,},{,,}};
int *ipArray[] = {iArray[], iArray[]};
int **pArray = NULL; pArray = ipArray; printf("array[0][0] = %d\n", pArray[][]);
printf("array[1][2] = %d\n", pArray[][]); return ;
}
c数组和指针的理解的更多相关文章
- C语言教学--二维数组和指针的理解
对于初学者对二维数组和指针的理解很模糊, 或者感觉很难理解, 其实我们和生活联系起来, 这一切都会变得清晰透彻. 我们用理解一维数组的思想来理解二维数组, 对于一维数组,每个箱子里存放的是具体的苹果, ...
- C语言数组和指针的理解_在取地址运算上的操作_指针加减操作_a 和&a 的区别
1.一个实例+理论分析 在了解数组和指针的访问方式前提下,下面再看这个例子: main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); pr ...
- 关于c语言二维数组与指针的个人理解及处理办法。
相信大家在学习C语言时,对一维数组和指针的理解应该是自信的,但是,我在学习过程中,看到网上一些博文,发现即便是参加工作的一些专业编程人员,突然碰到二维数组和指针的问题时,也可能会遇到难以处理的诡异问题 ...
- 深入理解C语言中的指针与数组之指针篇
转载于http://blog.csdn.net/hinyunsin/article/details/6662851 前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...
- 对于C语言中数组名是指针的理解
我们都知道,c语言中数组名是一个指针,比如下面这段代码 #include<iostream>using namespace std;int main(){ int a[4]={1,2,3, ...
- 深入理解C语言中的指针与数组之指针篇(转载)
前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ...
- (C初学) 对数组与指针的一些浅显的理解
因为课堂上没听懂,又看不懂教科书(<C语言程序设计教程>第3版 谭浩强,张基温编著)上晦涩的表达方式,昨天晚上特意拿<C语言入门经典>这本书自己研究了一晚的数组与指针. 先来一 ...
- 深入理解C/C++数组和指针
C语言中数组和指针是一种很特别的关系,首先本质上肯定是不同的,本文从各个角度论述数组和指针. 一.数组与指针的关系数组和指针是两种不同的类型,数组具有确定数量的元素,而指针只是一个标量值.数组可以在某 ...
- 程序员之--C语言细节13(二维数组和指针,&*a[i][0]的理解,数组1[e]和e[1]非常可能你没见过)
主要内容:二维数组和指针.&*a[i][0]的理解.数组1[e]和e[1] #include <stdio.h> #define NUM_ROWS 10 #define NUM_C ...
随机推荐
- adaboost学习资料收集
很通俗易懂的一篇博文 http://blog.csdn.net/haidao2009/article/details/7514787 百度搜索研发部的一篇文章 http://stblog.baidu- ...
- DNS(一)简介
最近学习相关DNS知识,顺便总结下相关内容. 1.什么是DNS DNS(Domain Name System)服务,可以使用域名代替复杂的IP地址来访问网络服务器,使得网络服务的访问更加简单,而且可以 ...
- Ubuntu 设置简单密码,复杂度太高
Ubuntu 中创建的用户密码复杂度很高,如果想设置1234 ,或者与账户名相同的密码时,SystemSetting 中是不可以设置的. 可以通过简单的命令来设置 其中 anyongfei 是账户名 ...
- 在C中定义一个动态的二维数组
一般来讲两种办法: 第一种:连续内存分配 #include "stdio.h" #include "stdlib.h" int main() { int x,y ...
- mysql fetch 系列函数
浏览器输出内容同上. 当使用 MYSQL_BOTH 或省略该参数是,将同时具有 MYSQL_NUM 与 MYSQL_ ASSOC 的特性. MySQL mysql_fetch_array 函数取得查询 ...
- Cocos2d-x中jsb结构剖析
libs/javascript下有两部分bindings和spidermonkey.其中spidermonkey为js虚拟机,暂时不去管它.bindings下分为四部分,分别为主干部分,generat ...
- Python引用传值总结
Python函数的参数传值使用的是引用传值,也就是说传的是参数的内存地址值,因此在函数中改变参数的值,函数外也会改变. 这里需要注意的是如果传的参数类型是不可改变的,如String类型.元组类型,函数 ...
- Django ORM 中的批量操作
Django ORM 中的批量操作 在Hibenate中,通过批量提交SQL操作,部分地实现了数据库的批量操作.但在Django的ORM中的批量操作却要完美得多,真是一个惊喜. 数据模型定义 首先,定 ...
- Java网络编程(UDP协议:发送端)
package WebProgramingDemo; import java.io.IOException; import java.net.DatagramPacket; import java.n ...
- thinkphp的目录结构
├─ThinkPHP.php 框架入口文件 ├─Common 框架公共文件 ├─Conf 框架配置文件 ├─Extend 框架扩展目录 ├─Lang 核心语言包目录 ├─Lib 核心类库目录 │ ├─ ...