数组指针遍历 数组指针

数组指针和指针数组的区别数组指针,是指向数组的指针 。通常所说的数组指针,只是一个指针,他只能存放一个地址 。一般用于多维数组 。
举例说明,假设有一个四行五列的二维数组A,C语言认为它是由四个五元素的一维数组首尾相连组成的 。当定义一个数组指针P时,让p指向二维数组的首地址,其实他指的也是第一个一维数组的首元素地址,当执行P+1之后,P就指向了第二个一维数组的首元素地址,或者p再+2以后就指向了第四个一维数组数组的首元素地址 。
int a[4][5]={{1,2,3,4,5},{6,7,8,9,10}}
(*p)[5]=a;
则*(*(p+1)+1)代表第二行的第二个元素7 。
指针数组是由若干指针组成的数组,它是一组指针,而不是一个指针 。它和普通的数组一模一样,只是它存放的是指针,也就是地址,而不是元素的值 。
如:
int a=2,b=3,c=5;
int*p[3];
p[0]=a;
p[1]=b;
p[2]=c;
则*p[1],*p[2]分别代表3和5 。
有什么问题请留言 。

数组指针遍历 数组指针

文章插图
数组指针怎么使用可以这样来
#include stdio.h
#include stdlib.h
#include string.h
int main()
{
char *d[4];
d[0]=malloc(1*sizeof(char));
strcpy(d[0],"web");
printf("%s",d[0]);
return 0;
}
此时*d[]为一个指向指针的指针
d[0]=malloc(1*sizeof(char));
此句话的意思是,分配1个字节的内存空间给d[0],也就意味着d这个数组的第一个元素[0]内保存的是一个1字节空间的地址,因为d[0]指向一个地址!
你可以这样理解
对于普通的数组(例如 char d[4];),在内存中是这样的
变量:内存地址:内容
d[0]:0x400000h:'w'
d[1]:0x400001h:'e'
d[2]:0x400002h:'b'
d[3]:0x400003h:'\0'
而在此处 char *d[4]; *d[0] = malloc(1*sizeof(char));,是这样的'
d[0]:0x400000h:0x400100h
d[1]:0x400001h:0x400101h
d[2]:0x400002h:0x400102h
d[3]:0x400003h:0x400103h
而在内存0x400100h处
才保存着"web\0"
不好意思,我上面说错了,应该是
d[0]:0x400000h:0x400100h
d[1]:0x400001h:NULL
d[2]:0x400002h:NULL
d[3]:0x400003h:NULL
而在内存0x400100h处
0x400100h:'w'
0x400101h:'e'
0x400102h:'b'
0x400103h:'\0'
对应的,你的代码执行后,内存变量应该是这样的
d[0]:0x400000h:0x400100h
d[1]:0x400001h:0x400104h
d[2]:0x400002h:0x400108h
d[3]:0x400003h:NULL
在内存0x400100处:
0x400100h:'w'
0x400101h:'e'
0x400102h:'b'
0x400103h:'\0'
0x400104h:随机字符
......
0x400108h:随机字符
以上内存地址是以字节方式内存对齐的,用一些编译器编译后可能地址会有些问题(比如d[0]到d[1]不止差了4,可能是8),但总体框架就是这样!
C语言数组指针?int (*pstu)[4]; 为指向有4个元素的数组的指针
int* getPosPerson(int pos, int (*pstu)[4]); 为返回值为指针的函数
注意这是指针函数,而不是函数指针,后者为指向函数的指针变量,两者含义是不同的
(类似指针数组和数组指针,两者含义也是不同的,一个本质是数组,一个本质是指针)
调用该函数的语句为:ppos = getPosPerson(pos, scores);
传入的scores表示3行4列的二维数组首行数组的地址,即scores[0]
调用后相当于int (*pstu)[4]=scores,所以在getPosPerson中pstu与scores是等价的
即pstu可看作scores[0],那么pstu+pos也就等价于scores+pos,等价于scores[pos]
即返回了指向scores[pos](也就是scores第pos+1行的地址)的指针
返回该行指针ppos 后,就可以查看该行表示的学生的4科成绩了
指针数组和数组指针的区别有哪些?指针数组和数组指针的区别主要有以下几点:
1、数组名不可以改变,而指向数组的指针是可以改变的 。字符串指针指向的字符串中的字符是不能改变的,而字符数组中的字符是可以改变的 。求数组长度时,借用数组名可求得数组长度,而借用指针却得不到数组长度 。
2、数组名的指向不可以改变,而指向数组的指针是可以改变的 。因为数组名的指向是不可以改变的,使用自增运算符自增就会改变其指向,这是不对的,数组名只能指向数组的开头 。
3、指针数组是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定 。数组指针是一个指针,它指向一个数组 。在32位系统下永远是占4个字节,至于它指向的数组占多少字节 。
4、字符串指针指向的字符串中的字符是不能改变的,而字符数组中的字符是可以改变的 。指针数组本身就是个数组,只不过呢,它里面存放的数据类型不是int,也不是char这类基本类型,而是一个指针类型,说白了就是地址 。

秒懂生活扩展阅读