指针数组怎么写

1. C语言 指向指针数组的指针怎么写 #include <stdio.h>
int main(int argc, char *argv[])
{
char *field_pointer[18] = {"1", "2", "3", "4", "5"};
【指针数组怎么写】char **p = field_pointer;//二级指针
//二级指针p的两种用法
printf("%s %s %s\n", field_pointer[2], p[2], *(p+2));
return 0;
}
2. 如何用指针求数组和 这个问题很有趣 , 要理解有个前提 , 你至少要思考过数组怎样在内存中存储 , 并且一个字节一个字节地画过 。
无论数组指针 , 还是指针数组 , 这样的名词性短语重心都在后面 , 所以数组指针是个指针 , 指针数组是个数组 。数组指针的实例:int(*p)[5]; 可以这样解释其定义:p是个指针 , 指向一个数组 , 数组有5个元素 , 每个元素是一个int型整数 。
在内存中 , p就是一个占4字节的变量 , 变量的值是个地址 , 在内存的那个地址处 , 有4*5=20个连续字节被认为是一个int[5]数组 。做一次p++,p的值增加20 。
这种特性和二维数组是有相似之处的 , 比如int k[3][5] , 事实上 , 可以这样赋值: p=k 。如果要在形参里使用 , 可以将变量名去除 , 就抽象出数据类型 。
典型的函数声明可以这样写:void f( int(*)[5] ); 典型的实参调用可以这样写:f(k); 这里的k是int k[3][5]二维数组 。我印象里要把二维数组名作实参使用 , 形参只能写成数组指针 , 形参直接写成二维数组是不行的 , void f( int [3][5]);这样声明会报错 。
也不能写void f( int** ); 因为int**和intint(*)[5]是不同的 , 前者做++只增4 , 后者增20 。指针数组的实例:int*p[5]; 这样解释:p是个数组 , 数组有5个元素 , 每个元素是一个指针 , 指向一个int型整数 。
这里p是数组名 , 是指针常量而不是变量 , 不可以对p赋值 , 这和上面比 , 是本质区别 。从内存占用情况来看 , 他和int p[5]没啥区别 , 每个元素都占4字节 。
所以使用时可以参考整型数组 , 只要把int替换成int*就行了 。比如声明时可用void f( int*[5] ); , 也可用void f( int** ); 。
调用实参时 , 就把实际的指针数组名传入即可 , 比如f(t); , 这里t是 int*t[5] 。这点篇幅其实是说不完的 , 书里都用一整章来讲呢 。
还是开头说的 , 研究一下数组及指针在内存里怎样存储 , 一个字节一个字节画一画 , 有好处 。
3. 指针数组的数组名表示什么 指针数组的数组名就是该指针数组首元素的地址的别名 。
比如 , 一个人可以叫王小二 , 也有叫它小二 , 或者小王 , 其实都是指同一个人 。
指针数组就比如这个例子:int *p[10] 那么p等价于&p[0]
因为指针里面存储的是地址(十六进制数) , 所以&p[0]这里面存放着一个int变量的地址 。
是不是觉得用地址来存放地址有点想不通 , 下面举一个简单的例子:
比如 int *p[10]; 可以把&p[0]看成一张记录着地址的纸 , 那么根据这张纸的地址找到某个仓库 , 在仓库里面又放着记录着一个int变量地址的纸 , 又根据这个地址找到了存放int变量的仓库 , 在这个仓库里面放着int的值 , 其实就想寻宝一样 , 根据一关一关的线索找到指定的宝藏 。