指针数组&数组指针

二维数组:

1)定义形如int a[2][3],此时a代表的是这个二维数组的地址,sizeof(a)为24。

二级指针:

1)定义形如int **p:表示为指向指针的指针

2)二级指针不能和二维数组替换,如int aa[2][3],**a;a=aa;是错误的,但可以用int (*a)[3];a=aa替换。

指针数组:

1)定义形如int *p[5]:表示含有五个指针元素的数组、又称为二维指针,可以和p[5][n]在一定情况下通用,sizeof(p)为20。

2)每个元素均是指针。如p[0]、p[1]均是指针。

如 char *p[5]={

“saf”,

“rfsdfds”,

“gjnaf”,

“asdfds”,

“wef”

};

p[0]~p[4]均表示字符串的地址

3)p相当于数组名是一个常量不可以更改,类似p++、p+=1均是错误的,所以p不能作为左值。

4)指针数组和二级指针之间的替换

char *p[5]={“saf”,”rfsdfds”,”gjnaf”, “asdfds”,”wef”};

char **q;

q=p;//此时相当于将p隐式转换了。还可以理解为p本身就是一个一维数组(一维数组的地址),只是多一个,那么就可以用多一个的一级指针来替换。

5)指针数组作为参数

函数声明为void fun(char *p[]),调用fun(p).

数组指针:

1)定义形如int (*a)[3].a为指向数组的指针,sizeof(a)为4。

2)数值指针可以和多维数组替换,但是多级指针不可以和多维指针替换。

int (*a)[3],**aa,aaa[2][3];

a=aaa;//正确

aa=a;//错误

aa=aaa;//错误

因为a和aaa都表示一个数组指针,而aa仅仅表示一个指针的指针。

3)作为形参

void fun(int (*a)[3])//二维下标必须要明确指出,后面编译器计算a[i][1]的地址就相当于计算a+i*3+1.

{

int i;

for(i=0;i<2;i++)

printf(“%d”,a[i][1]);

}

int main()

{

int a[2][3]={1,2,3,4,5,6};

fun(a);

}

时间: 2024-11-06 09:56:03

指针数组&数组指针的相关文章

C#委托与C语言函数指针及函数指针数组

C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用的时候通过指针访问这个函数. 在C语言中函数指针的申明如下: //可以理解为申明一个指着变量 Func ,它的类型是 返回Type(可以为 void )类型的参数,接收 (Type one,Type two,...)类型的//参数(可以不接受参数). Type *Func(Type one,Type

二维数组与指针

二维数组: int / char / flaot a[n][m]; 可以看做是将一维数组做为基本类型产生的一维数组的数组类型,共n*m个最基本类型.这样看有许多优点(实际上计算机也是这样分配的). 二维数组数组名的注意事项: 1 #include <stdio.h> 2 int main() 3 { 4 int *p,a[3][4]; 5 p = a;//a是二维数组的首地址本质为行指针,原型为 a[][]:无法赋值给普通指针类型 *p: 6 return 0; 7 } 编译就会出现如下错误

C编译器剖析_1.5 结合C语言来学汇编_指针、数组和结构体

让我们再来看一份C代码,及其经UCC编译器编译后产生的主要汇编代码,如图1.33所示,其中包含了数组.指针和结构体. 图1.33 数组.指针和结构体 按照C的语义,图1.33第9行的C代码是对局部数组number的初始化,需要把number[0]初始化为2015,而数组中的其他元素皆被初始化为0.UCC编译器采取的翻译方法是:先调用memset函数来把数组number所占的内存空间清0,然后再把number[0]设为2015,如图1.33的第17至24行所示.C库函数memset的API如下所示

qsort 函数的使用——对普通数组、指针数组、二维数组中的元素进行排序

在ANSI C中,qsort函数的原型是 #include <stdlib.h> void qsort(void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *)); 解释:qsort函数对含有nmemb个元素的数组进行排序,而base指针指向数组的第一个元素.这个数组的元素个数由size指定. compar函数对qsort的比较操作进行定义,所以可以定制数字的比较,字符串的比较,甚至结构体

数组与指针的区别?

数组要么在静态存储区被创建(如全局数组),要么在栈上被创建.指针可以随时指向任意类型的内存块.    (1)修改内容上的差别 char a[] = "hello";  //它们有各自的内存空间:a[0] = 'X';char *p = "world"; // 注意p 指向常量字符串p[0] = 'X'; // 编译器不能发现该错误,运行时错误 (2) 用运算符sizeof 可以计算出数组的容量(字节数).sizeof(p),p 为指针得到的是一个 指针变量的字节数,

指针和数组

指针的几个要点: 一 指针的定义,赋值 要区分: int a; int *p = &a; 这是定义的时候初始化,即赋值 ======================= int a; int *p; p = &a; 定义,初始化分开,  就这里我迷惑了好久 ========================== 多个(修饰符)修饰变量,看变量名先和谁结合(先看后缀)(ps:符号和变量之间的空格不要计算,和距离无关 int*和int *....... int * p [5]    先和[ ]结合

C---通过指针访问数组

C语言规定:如果指针变量P已指向数组中的一个元素,则P+1指向同一数组中的下一个元素. 引入指针变量后,就可以用俩种方法来访问数组元素了. 如果p的初值为&a[0],则: P+i 和a+i 就是a[i]的地址,或者说它们指向a数组的第i个元素. *(p+i)或*(a+i)就是p+i或a+i所指向的数组元素,即a[i].例如,*(p+5)或*(a+5)就是a[5]. 指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价. 根据以上叙述,引用一个数组元素可以用: 1.下标法:即用a[i]形式

指针数组 数组指针

指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针 数组指针:a pointer to an array,即指向数组的指针 还要注意的是他们用法的区别,下面举例说明. int* a[4]     指针数组 表示:数组a中的元素都为int型指针 元素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于* int (*a)[4]   数组指针 表示:指向数组a的指针 元素表示:(*a)[i] 注意:在实际应用中,对于指针数组,我们经常这样使用: 1

数组与指针

//使用递归来计算阶乘#include<stdio.h>long rfact(int n);int main(){ int num; printf("This program calculate factorials.\n"); printf("Enter a value in the range 0-12(q to quit): \n"); while(scanf("%d",&num)==1) { if(num <0

指针、数组的理解与关系

一.指针的本质:变量,指针变量就是指针变量int *p:两个变量,一个p(指针变量本身)是int *类型的 另一个是*p(指针指向的那个变量)是int类型的注:指针说白了就是指针类型,前面定义的int类型是为了说明指针指向的那个数的类型,所以指针的解析方式都是按地址来解析的(不管你是char *还是double *,解析方式都是地址)而指向的那个数的类型就要看你怎么定义的了例如:int *aa是按照地址来解析的:*a则是按照int类型来解析的. (1)所有的类型的数据存储在内存中,都是按照二进制