C语言->实验室->指针数组
一 分析
讨论指针数组要从三个层面来考虑:
1)指针数组本身是什么
2)指针数组作为参数时的表现
3)指针数组作为返回值时的表现
二 指针数组是什么
1)指针数组--指针的集合
数组是若干元素的集合,那么指针数组就是若干个指针的集合,这个集合内的所有元素都是独立的指针。
2)定义一个指针数组
char* sChar[10];
这里定义了一个指针数组,‘int*’表明其数据类型为int型指针,‘[10]’表明这个集合有10个指针。
3)试用
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> int main()
{
char* argList[];
char* sChar = "";
int i; for(i = ;i<;i++)
{
argList[i] = (char*)malloc(sizeof(char)*);
memset(argList[i],'\0',);
strcpy(argList[i],"");
} for(i = ;i<;i++)
{
printf("%s\n",argList[i]);
} for(i = ;i<;i++)
{
free(argList[i]);
}
return ;
}
输出:
在上面的例子中,我们可以简单的将指针数组当做一个指针的集合,数组内所有元素都是独立的指针。
三 指针数组作为参数
1)常规应用
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> int main()
{
char* argList[];
int i; for(i = ;i<;i++)
{
argList[i] = (char*)malloc(sizeof(char)*);
memset(argList[i],'\0',);
strcpy(argList[i],"");
} DataPrint(argList); for(i = ;i<;i++)
{
free(argList[i]);
}
return ;
} int DataPrint(char* argList[])
{
int i;
for(i = ;i<;i++)
{
printf("%s\n",argList[i]);
}
}
上面的代码中,我们在主函数中为指针数组分配了内存和值,将其作为参数传递给DataPrint函数,在DataPrint函数中将指针数组的值打印出来,如下:
2)指针数组中每一个元素都是指针
指针数组中的每一个元素都能当做单独的指针来使用,其特性我们就不多说了。
3)指针数组作为参数传递时,传递的是地址
对于非数组参数,在作为参数进行传递时是将其值传递给了函数,而不是该变量本身,例如:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> int main()
{
int a=;
fun(a);
} int fun(int b)
{
b=;
return ;
}
上面的代码中,b的值一开始由a变量传递过来为1,然后在fun函数中被重新赋值为3.整个过程中,a变量的值都是1。
而数组作为参数进行传递时,考虑到数组内数据量可能很大,所以不会将数组的值传递下去,而是传递该数组的首地址,这样的传递方式就会参数一些有趣的现象。不过在此之前,我们先来看看数组以及指针数组是怎么组成的。
a)定义一个数组
int A[10] = {0,1,2,3,4,5,6,7,8,9};

b)将这个数组作为参数传递
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> int main()
{
int A[] = {,,,,,,,,,}; printf("A[0]:%u\n",A[]);
fun(A);
printf("A[0]:%u\n",A[]); return ;
} int fun(int B[])
{
B[]=;
return ;
}
在fun函数中,因为数组传递时传递的是地址而非值,于是B数组:

可以看到,B数组内所有元素在内存中的地址与A数组一致,那么我们改变B数组的值也会间接地改变了A数组的值
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> int main()
{
int A[] = {,,,,,,,,,}; printf("A[0]:%u\n",A[]);
fun(A);
printf("A[0]:%u\n",A[]); return ;
} int fun(int B[])
{
B[]=;
return ;
}
输出
A[]:
A[]:
可以看到,A[0]的值在调用fun函数后发生了改变,这是因为数组将地址而不是值传递给了fun函数,在这种情况下,我们可以简单的认为B=A。
c)定义一个指针数组
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> int main()
{
char* argList[];
int i; for(i = ;i<;i++)
{
argList[i] = (char*)malloc(sizeof(char)*);
memset(argList[i],'\0',);
strcpy(argList[i],"");
}
}
此时argList在内存中表现为

d)将指针数组作为参数传递
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> int main()
{
char* argList[];
int i; for(i = ;i<;i++)
{
argList[i] = (char*)malloc(sizeof(char)*);
memset(argList[i],'\0',);
strcpy(argList[i],"");
} DataChange(argList); for(i = ;i<;i++)
{
printf("%s\n",argList[i]);
} return ;
} int DataChange(char* argList[])
{
int i;
for(i = ;i<;i++)
{
argList[i]++;
}
}
在上面的代码中,我们在DataChange函数内执行了argList[i]++,那么这一语句具体产生了什么效果?argList[i]表明的是argList的第i个元素,其本质是一个指针,该值加一表明该指针元素指向的地址值加一,所以现在argList的内存表现为:

argList[0]++使得ABC00中的XX00值加一,跳过了0值,所以最后输出为
C语言->实验室->指针数组的更多相关文章
- go语言学习--指针数组和数组指针
数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长.也就是说执行p+1时,p要跨过n个整型数据的 ...
- c语言.函数指针数组
函数指针: 一个指向函数的指针.一般用函数名表示. 函数指针数组:元素为函数指针的数组.转移表.c语言中函数不可以定义为数组,只能通过定义函数指针来操作. #include<stdio.h> ...
- C语言通过指针数组和二维数组读取文件
1 # include <stdio.h> 2 # include <stdlib.h> 3 # include <time.h> 4 # include < ...
- C语言中指针数组和数组指针的区别
指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定.它是“储存指针的数组”的简称. 数组指针:首先它是一个指针,它指向一个数组.在32 位系统下永远是占4 个字节,至于它指 ...
- 【C语言】指针数组
题目:编写UNIX程序sort的简化版本,该程序按字母顺序对由文本行组成的集合进行排序. 思路:我们引入指针数组处理这种问题.如果待排序的文本行首尾相连地存储在一个长字符数组中,那么每个文本行可通过指 ...
- C/C++语言中指针数组和数组指针比较区别
指针数组:int *p[3] 定义一个指针数组,其中每个数组元素指向一个int型变量的地址 意思就是指针的数组,数组里面都是指针 例子: int *p[3];//定义了一个指针数组,有3个成员,每个成 ...
- c语言 字符指针数组的用法
#include <stdio.h> #include <stdlib.h> int main(){ //字符数组的使用 char str[] = {'z','b','c',' ...
- C语言的指针数组与指针数组
一.指针数组与指针数组 1,指针数组 顾名思义,即一个元素全部是指针的数组,其形式与普通数组相似,形式如 *a[N]. 在理解指针数组的使用方式前,我先来说下我个人对数组的理解. 比如一维整形数组(形 ...
- 关于C语言的指针数组与指针数组的个人理解
一.指针数组与指针数组 1,指针数组 顾名思义,即一个元素全部是指针的数组,其形式与普通数组相似,形式如 *a[N]. 在理解指针数组的使用方式前,我先来说下我个人对数组的理解. 比如一维整形数组(形 ...
随机推荐
- python的paramiko源码修改了一下,写了个操作命令的日志审计 bug修改
python的paramiko源码修改了一下,写了个操作命令的日志审计,但是记录的日志中也将backspace删除键记录成^H这个了,于是改了一下代码,用字符串的特性. 字符串具有列表的特性 > ...
- Java 使用jaxp修改节点
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <perso ...
- 以一则LUA实例说明敏捷开发中“分离构造和使用”原则
分离构造和使用 构造含义是功能的实现, 此功能是一个定义明确的处理过程, 开放出明确的接口给调用者使用. 则使用者可以直接调用接口进行使用, 但是使用者需要搞清楚, 那些是构造, 那些是使用. 不要再 ...
- TCP中异常关闭链接的意义 异常关闭的情况
终止一个连接的正常方式是发送FIN. 在发送缓冲区中 所有排队数据都已发送之后才发送FIN,正常情况下没有任何数据丢失. 但我们有时也有可能发送一个RST报文段而不是F IN来中途关闭一个连接.这称为 ...
- Chrome浏览器M53更新后超链接的dispatchEvent(evt)方法无法触发文件下载
一个经典的js前台文件下载方法: var aLink = document.createElement('a'); var datatype="data:text/plain;charset ...
- 非空二叉树的一个有趣的性质:n0 = n2 + 1
对任何非空二叉树T,若n0 表示叶结点的个数.n2 表示度为2 的非叶结点的个数,那么两者满足关系n0 = n2 + 1. 这个性质很有意思,下面我们来证明它. 证明:首先,假设该二叉树有N 个节点, ...
- 感冒了~ vs中py和vb实现一个小算法
1+1*2+1*2*3+--+1*2*3*n 下面是窗体,就一个按钮和编辑框. 中途还遇到了编码问题,但是感冒太难受,加上明天还要上课.就睡了~ 晚安世界.
- 最长公共上升子序列(LCIS)
最长公共上升子序列慕名而知是两个字符串a,b的最长公共递增序列,不一定非得是连续的.刚开始看到的时候想的是先用求最长公共子序列,然后再从其中找到最长递增子序列,可是仔细想一想觉得这样有点不妥,然后从网 ...
- paper 96:计算机视觉-机器学习近年部分综述
计算机视觉和机器学习领域 近两年部分综述文章,欢迎推荐其他的文章,不定期更新. [2015] [1]. E.Sariyanidi, H. Gunes, A. Cavallaro, Aut ...
- 设置IE默认文本模式的方法
设置IE默认文本模式的方法 <meta http-equiv="X-UA-Compatible" content="IE=8" /> IE=5.6. ...