c语言,数组和指针
概要:
1.普通数组与指针
2.数组指针
3.指针的数组
数组是一个由(同一类型)连续元素组成的预先分配的内存块;指针是一个对任何位置的元素的引用。
数组自动分配空间,但不能重分配或改变大小;指针必须被赋值以指向分配的空间,可以随意重新赋值。
指针可以模拟数组;几乎没有所谓数组的东西,实际是个指针操作符。
1.普通数组和指针
#include <stdio.h> int main()
{ int arry[10];
int *p=arry;
arry[1]=100;
printf("arry[1]=%d,p[1]=%d \n",arry[1],p[1]); return 0;
}
/*
root@oucaijun:/work/dcc# gcc *.c; ./a.out
arry[1]=100,p[1]=100
*/
2.数组指针
为什么数组的指针在声明时一定说明数组最后一个维度的大小呢?答案很简单。
数组指针虽然是一种指向指针的指针,但是,既然我们称其为数组指针而不是普通的指向指针的指针,就是因为他们之间有一个根本性的区别。
普通指向指针的指针,在类型信息描述中,包含的是其指向的指针变量占用的空间(也就是说,恒为2);
而数组指针在类型信息里面包含了数组的大小信息(在多维数组指针中,可以忽略前面各个维度的大小,但是不能忽略最后一个维度的大小,在随后的章节中,我们将详细讲解其中的原因)。
通俗的说:作为一个数组指针,要想与普通的“指向指针的指针”划清界限、标新立异,就必须要包含数组的大小信息,否则就“没有脸面被称之为数组指针”。
因此,对于一个指向数组的指针来说,要想证明自己是一个真正的“数组指针”而不是普通的“指向指针的指针”,就必须拥有数组大小“这一关文凭'。而且,这一“文凭”在数组指针参与sizeof()运算时还要出具。如果sizeof()发现其出具的文凭等级不够,编译器会报告错误。
#include <stdio.h> int main()
{ int i, j;
int arry[2][3]={ {11,12,13}, {21,22,23}}; int (*q)[][3]=&arry; //q是一个指针,该指针指向一个x*3二维数组,数组内的数据元素是int。
int (*p)[2][3]=&arry; //p是一个指针,该指针指向一个2*3二维数组,数组内的数据元素是int。 //printf("sizeof(*q)=%d\n",sizeof(*q)); // error: invalid application of ‘sizeof’ to incomplete type ‘int[][3]’
printf("sizeof(*p)=%d\n",sizeof(*p));
printf("sizeof(arry)=%d\n",sizeof(arry)); for(i = 0; i < 2; i++ ){
for(j = 0; j < 3; j++ ){
printf("arry[%d][%d] = %d\n", i, j, arry[i][j]);
}
} for(i = 0; i < 2; i++ ){
for(j = 0; j < 3; j++ ){
printf("(*q)[%d][%d] = %d\n", i, j, (*q)[i][j]);
}
} for(i = 0; i < 2; i++ ){
for(j = 0; j < 3; j++ ){
printf("(*p)[%d][%d] = %d\n", i, j, (*p)[i][j]);
}
} return 0;
}
/*
root@oucaijun:/work/dcc# gcc *.c; ./a.out
sizeof(*p)=24
sizeof(arry)=24
arry[0][0] = 11
arry[0][1] = 12
arry[0][2] = 13
arry[1][0] = 21
arry[1][1] = 22
arry[1][2] = 23
(*q)[0][0] = 11
(*q)[0][1] = 12
(*q)[0][2] = 13
(*q)[1][0] = 21
(*q)[1][1] = 22
(*q)[1][2] = 23
(*p)[0][0] = 11
(*p)[0][1] = 12
(*p)[0][2] = 13
(*p)[1][0] = 21
(*p)[1][1] = 22
(*p)[1][2] = 23
*/
3.指针的数组
这个没甚么特别的。
c语言,数组和指针的更多相关文章
- C语言 > 数组和指针
C语言 数组和指针 const: 关于指针和const需要注意一些规则.首先,把const数据或非const数据的地址初始化为指向const的指针或为其赋值是合法的. 然而,只能把非const数据的地 ...
- C语言数组和指针的理解_在取地址运算上的操作_指针加减操作_a 和&a 的区别
1.一个实例+理论分析 在了解数组和指针的访问方式前提下,下面再看这个例子: main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); pr ...
- 深入解析C语言数组和指针
概述 指针是C语言的重点,同时也是让初学者认为最难理解的部分.有人说它是C语言的灵魂,只有深入理解指针才能说理解了C语言.暂且撇开这些观点不谈.这章是我在阅读<C和指针>这本书的读书笔记. ...
- C语言数组与指针总结
寒假要开始猛刷<剑指offer>,先回顾一下C语言基础做个热身. 指针 相信大家对下面的代码不陌生: ; int *p; p=&i; 这是最简单的指针应用,也是最基本的用法.再来熟 ...
- C语言数组和指针是不同的
有一个这样的错误: 在一个文件中定义:int mango[100]; 在另一个文件中声明:extern int *mango; 将会产生错误 定义和声明的区别: 在C中,任何对象都有且只有一个定义 ...
- (C语言)数组与指针的区别
以前常常听过这种说法,说数组和指针这两者比较像,但是不能混淆,可是一直没能理解.刚刚在李云的<专业嵌入式软件开发>中,看了讲述数组与指针区别的一章,似乎有所领悟.本着知乎上看到的这张图,我 ...
- (转载)C语言 数组与指针的区别
1) 字符串指针变量是个变量,指向字符串的首地址:而字符串数组名是个常量,为字符串数组第一个元素的地址: 2)字符串指针变量可以赋值,而字符串数组名不能赋值:对于字符数组只能对各个元素赋值,不能用以下 ...
- C语言-数组与指针 字符与字符串
1 字符与字符串:char c='a'而不能写出char c="a" //字符变量用单引号'',而字符串用双引号. 2 字符数组与字符指针的初始化: char s[10]={0}, ...
- c语言-数组、指针面试题
转载 说明:所有题目均摘录于网络以及我所见过的面试题目,欢迎补充! 无特殊说明情况下,下面所有题s目都是linux下的32位C程序. 先来几个简单的热热身. 1.计算以下sizeof的值. char ...
- C语言数组,指针小案例
/* ============================================================================ Name : hello.c Autho ...
随机推荐
- Laravel OAuth2 (二) ---配置与数据库设计
前言 使用 OAuth2 进行第三方登陆分为好几种情况,例如完全第三方登陆,不保存任何用户信息,或者第三方登陆后保存用户信息关联本站账号.个人觉得保存一下用户信息比较妥当(虽然这样注册的时候让用户觉得 ...
- python概要
python与r语言接口Rpy,统计 科学计算,数值拟合:numpy,scipy 可视化2d:matplotlib,Pylab 可视化3d:mayaviz 复杂网络:networkx 交互终端: bs ...
- Uva 11694 Gokigen Naname
基本思路是Dfs: 1. 一个一个格子摆放,以每个各自的左上角的点为基准点代表格子,比如(0,0)代表(0,0)(0,1)(1,0)(1,1)组成的格子,(0,1)代表(0,1)(0,2)(1,1), ...
- Sicily-1006
一. 题意 这道题就是考排列组合吧,再来就是比较一下字符的下标算一下两个ranking的距离.然后我总结了一个排列和一个组合的实现方法,这道题直接用的是stl 里面的next_permutation ...
- 警告:‘xxxx’ 将随后被初始化
关于编译报警告.本次是接手一个新手的代码,总共不到1K行的代码.两个类.编译的时候报的警告,本来也不打算管理这个事情的.要求也不会有那么严格.但上午看完代码后,觉得毕竟是新手写的代码,还是有很多需要修 ...
- (3)选择元素——(3)$()方法(The $() function)
No matter which type of selector we want to use in jQuery, we always start with the same function: $ ...
- Linux 各类软件整理汇总
关于前端和后端的解释 详细链接见:http://wiki.ubuntu.org.cn/Qref/Apps Linux下程序通常不需要作为一个整体,而是模块化,于是有了可选的前端和后端——这种情况下:前 ...
- DDFT
得知DIP文章4日 傅立叶变换数学原理将可能完全被引入,下仅仅实现代码.观察下结果,公式在上一篇博客中已经描写叙述 上代码: // // main.c // Fourer2D // // Create ...
- JavaScript 高级程序设计(第3版)笔记——chapter3:基本概念(函数部分)
3.7函数 3.7.1 理解参数 ECMAScript 函数不介意传递进来多个参数,也不在乎传递进来的参数是什么数据类型.因为在 ECMAScript 中的参数在内部是用一个数组来表示的.在函数体内可 ...
- 【QT相关】Image Viewer Example
结合QLable和QScrollArea显示一个图片. QLable典型用于用户展示文本,但是也能展示图片.QScrollArea提供了一个滚动视图,如果子控件超过了框架限制,QScrollArea自 ...