首页 > 代码库 > 数组和指针
数组和指针
指针的类型 | 指针所指向的类型 | sizeof(*ptr) | 说明 | |
int *ptr; | int * | int | 4 | |
int **ptr; | int ** | int * | 4 | |
int (*ptr)[3]; | int(*)[3] | int()[3] | 12 | 指向有3个int型元素的数组 |
int (*ptr)(int); | int (*)(int) | int ()(int) | 指向函数的指针,该函数有一个整型参数并返回一个整型数 |
c,指针的值是指针本身存储的数值,这个值将被编译器当作一个地址。在32位程序里,所有类型的指针的值都是一个32位整数。
指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。<2>指针的强制类型转换
a,新指针的类型是TYPE*: ptr1=(TYPE*)ptr2
如果sizeof(ptr2的类型)大于sizeof(ptr1的类型),那么在使用指针ptr1来访问ptr2所指向的存储区时是安全的。如果sizeof(ptr2的类型)小于sizeof(ptr1的类型),那么在使用指针ptr1来访问ptr2所指向的存储区时是不安全的。
2.指针和多维数组
<1>二维数组初始化:date={{1,2,3},{4,5,6}} 也可以省去{}。
<2>int zippo[4][2];
int (*pz)[2];
//pz指向包含两个int值的数组,即是指向一二维数组,该二维数组有2列。使用该类型指针时注意不要超过二维数组的行数的范围
pz=zippo;
zippo==&zippo[0]; zippo[0]==&zippo[0][0]; zippo==&(&zippo[0][0]);
*(zippo+2)==zippo[2]==&zippo[2][0]第三个元素,即包含2个int值的数组
*(*(zippo+2)+1)==zippo[2][1]
指针兼容
int **p1;int *p2[2];
p1=pz;(非法)//pz是指向int[2]型的指针。p1是指向int *的指针
p1=p2;(合法)
函数和多维数组
void fun(int (*pz)[2]);
void fun(int pz[][2]);
}
}
}
}
}
注意
<1>int days[]={....},sizeof days是整个数组的大小;sizeof day[0]是一个元素的大小(以字节为单位)
<2>C并不检查你是否使用了正确的下标,例如:int a[10];a[10]=12;编译器不会发现这样的错误。当程序运行时,这些语句把数据放在可能由其他数据使用的位置,因而可能破坏程序的结果甚至使程序崩溃。
<3>在返回指针变量时,注意不要用return返回指向栈内存中的指针。否则,函数返回后该指针指向的内存被释放。
<4>当创建一个指针时,系统只分配了用来存储指针本身的内存空间,并不分配用来存储数据的内存空间。因此在使用指针之前,必须给它赋予一个分配的内存。(可用malloc或把一已存在的变量地址赋给指针)。
数组和指针