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;
}
/*
[email protected]:/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;
}
/*
[email protected]:/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.指针的数组

这个没甚么特别的。

时间: 2024-10-18 02:34:44

c语言,数组和指针的相关文章

c语言数组与指针详解(上)

彻底搞懂c语言数组与指针 部分引用 c语言指针怎么理解 知乎 程序设计入门----c语言 (浙江大学翁恺) <c primer plus>第六版 基础知识 1. 指针基础 &:代表对变量取地址 int*或char*或者把这个星号紧贴着变量比如int *a = &b: 代表新建一个用来储存地址的变量,这也代表&b这个值的类型是int*. int *a, b 或 int* a, b 中只有a是int指针类型,b是int整型. 关于电脑大小端的讨论:大端是指是指数据的高字节,

C语言数组与指针

一维数组与指针 int a[10]; int *pa; 一维数组的数组名代表的就是该数组第一个元素的地址,所以复制语句pa=&a[0]等价于pa=a.对数组元素a[i]的引用等价于*(a+i).在计算数组元素a[i]的值时,C语言实际上先将*(a+1)后再进行求值,所以用指针编写的程序比用数组下标编写的程序执行速度快. 数组名和指针之间有一个不同之处,指针是一个变量,pa=a和pa++都是合法的.但数组名不是变量,因此,类似于a=pa和a++形式的语句是非法的. 当把数组名传递给一个函数时,实际

(C语言)数组与指针的区别

以前常常听过这种说法,说数组和指针这两者比较像,但是不能混淆,可是一直没能理解.刚刚在李云的<专业嵌入式软件开发>中,看了讲述数组与指针区别的一章,似乎有所领悟.本着知乎上看到的这张图,我试着将自己的理解写一些. 首先需要了解数组和指针的工作模式. 数组: char name[] = {'T', 'o', 'n', 'y', '\0'}; 此时,这个数组的地址是这样的.其中name指向数组的开头: 指针: char name[] = {'T', 'o', 'n', 'y', '\0'}; ch

C语言关于数组与指针内容小结

数组的基本概念 什么是数组:数组就是:数组是相同类型的元素的一个集合       类型说明符 数组名 [常量表达式]: 其中,类型说明符是任一种基本数据类型或构造数据类型.数组名是用户定义的数组标识符.方括号中的常量表达式表示数据元素的个数,也称为数组的长度.例如: int a[10]; /* 说明整型数组a,有10个元素 */ float b[10], c[20]; /* 说明实型数组b,有10个元素,实型数组c,有20个元素 */ char ch[20]; /* 说明字符数组ch,有20个元

C语言中的指针与数组的关联1

在C语言中,指针是一种类型,存放的是地址,例如char*p,这里p存放的是字符型数据的地址,int*p,p存放的是整形数据的地址,我们可以通过解运用*来获取该地址所指向的内容.而数组则是一种数据类型的集合,如int arr[]={1,2,3,4,5,6,7,8,9,10};这里声明与定义了一个整形数组,而char arr[]="hello world";则是声明与定义了一个字符类型的数组,这个数组内存放的是一个字符串. C语言规定,在大多数情况下数组名其实质就是数组元素的首地址,所以我

C语言中数组与指针

数组是内存空间的一片连续的区域,用于存贮一组相同数据类型元素的集合. 指针变量中存放的是变量的地址,通过指针取得地址,再通过地址提取数据. 在大多是C语言书中,都有这样的说法,“数组和指针是相同的”.其实,数组与指针,只能在特定的情况下才是相同的,在大多书情况下,他们并不相同. C语言中每个表示变量的符号都代表一个地址,而每个变量的值就是该地址里所存储的内容. 定义一个字符数组 char a[]="asdfghjkl";现在来访问第i个字符a[i],编译器符号表中具有一个符号,它代表的

C语言之数组与指针(一)

---恢复内容开始--- 数组:内存连续的,同类型元素的集合: 从最基础的数组声明,数组初始化,数组赋值,数组遍历,到二维数组,再到指针数组,数组指针,以及数组和指针关系无疑都证明了数组在c语言中的重要地位:我们将一 一对其说明. 1.数组声明:float a[size] ; int b[size]; char c[size];(size是数组元素个数,必须为正整数 : #define  size 10   ) 这样我们就声明了一个数组:但是在下面代码中我们可以看出了一个问题:没有初始化的数组中

读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组

原文链接:C语言结构体里的成员数组和指针 复制如下: 单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Laruence同学出了一个关于C语言的题,微博链接.微博截图如下.我觉得好多人对这段代码的理解还不够深入,所以写下了这篇文章. 为了方便你把代码copy过去编译和调试,我把代码列在下面: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <stdio.h>

程序猿之--C语言细节13(二维数组和指针,&amp;*a[i][0]的理解,数组1[e]和e[1]很可能你没见过)

主要内容:二维数组和指针,&*a[i][0]的理解.数组1[e]和e[1] #include <stdio.h> #define NUM_ROWS 10 #define NUM_COLS 10 int main(int argc, char **argv) {     int a[NUM_ROWS][NUM_COLS], *p, i = 0; // a理解为指向整数指针的指针 即int **     int c, d=2,*test, e[2] = {4,5},f[2][2] = {{

C语言 二维数组与指针笔记

今天分析了C语言二维数组和指针的基本理解,感觉有点懵...代码记录一下,如果有大神临幸发现哪里有误,欢迎指正~~~ #include <stdio.h> #include <stdlib.h> #include <string.h> //void func(int p[][]) //这样写等同于void func(int **p) p++移动了四个字节,(*p)++移动了四个字节,不符合二维数组规律 //{ //} //列优先输出的函数(即竖着输出) void func