指针知识梳理10-指向数组的指针

一、指向数组的指针

1、所谓指向的意思:我们通常说指针变量指向某个变量或者某块内存,意思是这个指针变量存储了某个变量的地址或者某块内存的地址。

2、一个变量可以占多个字节,我们通常所说某个 的地址指的是这块内存的起始地址。比如int  a,变量a栈 0x10 0x11 0x12 0x13这四个字节,那么a的地址是0x10.

3、(1)以前我们定义一个数组的时候,通常是把这个数组当做同种类型的变量的集合来看的,即数组的每个元素,用法为a[i].

(2)我们也可以把数组当做一个整体来看,int  a[5],  a是个变量,这个变量的类型是数组,这个变量占40个字节,。

按照变量定义基本模型 type  name ,如果数组是这么定义可能更好理解这个整体概念, int[10]   a,但是C语言语法不是这样写的。

(3) 得到一个变量的地址 用&符号,那么当把数组a看做一个变量的时候,它的地址为 &a.

如果要存储 &a这个数据,需要相应的指针变量,即所谓指向数组的指针。

定义方法如下  int (*p)[5],其实按照  type *p 这个模型来定义,int[5]  *p 这种写法更好理解,只不过C语言的爸爸在创造语法的时候不这么规定。

那么 p = &a;

对于 p 来说,p+i 地址偏移 i*sizeof(a)

(4) 以下需要分清楚区分

对于 int a[5];

&a 与 &a[0] 的区别,这两个得出来的地址 在数值上是相等的,但是他们的数据类型是不一样的。

int  *p1 = &a[0];

int  (*p2)[10] ;

p2 = &a;

如上图,我们分别把数组当做集合和整体来看。

p1 存储a[0]的地址 ,也就是a[0]的起始地址,0x10.

p2 存储a的地址,也就是数组的其实地址,也是a[0]的起始地址 0x10.

p1+1  结果为 0x14

p2+1  结果为 0x24

4、typedef 用法

typedef  int(type*)[5];

type 是种类型,是指向一维数组的指针类型(说法比较拗口),以下写法定义变量p1是等效的。

type  *p1;

int (*p1)[5];

5、在语法层面上使用

typedef  int(type*)[5];

int  a[5];

type p;

p = &a; //这里数组名就不代表的是a[0]的地址了。

那么 *p 就是 a 了。

a[i] ---> (*p)[i];// 注意这里优先级

二、二维数组的数组名

int  a[2][3];

二维数组可以看成一维数组,a[0]   a[1]是数组的两个元素,每个元素是 个一维数组 (int[3]).

一维数组的数组名可以代表第一个元素的地址,第一个元素是个int[3]型的数组。

typedef  int(*p)[3];
int a[2][3];
p = a;
p = &a[0];
for(i = 0;i<2;i++)
{
	for(j = 0;j<3;j++)
	{
	//以下几种方式等效
		a[i][j]  = 1;
		*(*(p+i)+j)  = 1;
		*(p[i]+j) = 1;
		p[i][j] = 1;
	}
}

指针知识梳理10-指向数组的指针

时间: 2024-12-19 12:08:25

指针知识梳理10-指向数组的指针的相关文章

指针知识梳理9-指针数组

1.基本概念 指针数组:本质是数组,数组的每个元素是指针,数组的每个元素可以存储地址. 2.基本定义 (1)先回顾,数组定义基本模型 type a[len]; 访问 数组的每个成员用 a[i]; 每个成员所占内存大小 sizeof(type); 数组总共占内存大小  sizeof(a) = sizeof(type)*len; (2)指针数组 如果学会了指针,学会了数组,到了这里就是一个综合应用的问题. 按照以上模型: ---------------------------------------

指针知识梳理5-字符串与指针,程序内存总结

一.文字常量区域 #include <stdio.h> int main() { char *p = "hello"; int i = 0; for(i = 0;i<6;i++) { printf("%c",*(p+i)); } *p = '1'; } 大家分析验证以上代码.p 是一个指针变量,存储地址,"hello"是一个字符串占6个字节,当我们用printf的时候可以输出"hello",我们得出结论,p存

《征服 C 指针》摘录3:数组 与 指针

一.数组 和 指针 的微妙关系 数组 是指将固定个数.相同类型的变量排列起来的对象. 正如之前说明的那样,给指针加 N,指针前进“当前指针指向的变量类型的长度 X N”. 因此,给指向数组的某个元素的指针加 N 后,指针会指向 N 个之后的元素. #include <stdio.h> int main(void) { int array[5]; int *p; int i; /* 给数组 array 的各元素设定值 */ for (i = 0; i < 5; i++) { array[i

指针知识梳理2-指针与一维数组

一.一维数组复习 数组的本质是连续的内存,我们可以通过一下代码验证. int main() { int a[10]; int i; for(i = 0;i<10;i++) { printf("%p\n",&a[i]); } } 打印出每个元素的地址,会发现地址间隔是4 ,这个间隔刚好等于sizeof(int). 那么如果知道了a[0]的地址,我们就可以通过地址的加减算出a[i]的地址,然后访问a[i]; 二.通过指针访问一维数组 指针能够访问一维数组的两个前提是: 1.内

指针知识梳理3-指针作为参数

一.函数传参复习 #include <stdio.h> //指针传参,函数传参本质是值传递 void func1(int a) { a = 5; } void func2(int *p) { *p = 10; p++; } int main() { int a = 0; int *p = &a; //a 的值会变么? func1(a); printf("%d\n",a); func2(&a); printf("%d\n",a); //这里

指针知识梳理6-const与指针

const 定义的变量为只读变量,在语法层面上通过这个变量去修改内存是不允许的. 但是对于以下代码,就有很多人绕了: const int  *p1;  //p1能变,*p1不能变 int const  *p2;  //p2能变,*p2不能变 int *const  p3;  //p3不能变,*p2能变 我们通过代码来验证说明这三种写法: </pre><p></p><pre> #include <stdio.h> int main() { int

指针知识梳理1-变量基本定义及使用

一.指针变量.地址.数据.内存关系 在学习指针之前,我们先统一几个概念. (1)在计算机中本质 用 内存 来存储 数据 ,在我们写代码的时候,用变量来存储数据 . (2)变量是在编程语言中的概念,方便我们编程,当编译运行起来以后,就只有内存了和数据了. 比如 当 我们写代码 int a; int b; a = 1; b = a; 第1行第2行,语法层面是 定义两个变量,计算机层面是在内存中申请 2个4字节内存,a地址 0x10,b地址  0x0c 第3行,语法层面是 给变量a赋值1,计算机层面是

【C语言学习】《C Primer Plus》第10章 数组和指针

学习总结 1.数组初始化方式: int a[]={1,2,3} int a[SIZE]={1,2,3} //SIZE是宏定义,数组初始化个数不能大于SIZE,否则报错:当个数小 //SIZE,自动补0:只定义不初始化,默认值是当前存储单元中已有的数值. int a[SIZE/不定长]={1,[3],2} //C99支持通过[int]=x来定义具体位置值,跳过的默认值为0. 2.通过const修饰的数组为只读数组,数组的每个元素当成常量来处理,如: const int a[2]={1,2}; co

[C++程序设计]用指向数组的指针作函数参数

1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 void output(int (*p)[4]); 7 int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; 8 output(a); 9 return 0; 10 } 11 12 void output(int (*p)[4]) 13 { 14 int i,j; 15 for(i = 0; i < 3; i ++) 1