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]. 在理解指针数组的使用方式前,我先来说下我个人对数组的理解. 比如一维整形数组(形 ...
随机推荐
- vim - Putting the current file on the Windows clipboard
http://vim.wikia.com/wiki/VimTip432 command! Copyfile let @*=substitute(expand("%:p"), '/' ...
- webstorm 代码自动换行
代码自动换行 菜单File→Settings→Editor→General
- C#异步:实现一个最简单的异步
异步就是方法异步执行, 这个好理解. 异步有啥用? 以前只是听说过, 也不想计较. 不过还是碰到了需要这个东西的时候. 比如: 定时执行, 如果不用异步方法,也不用定时器,只用Thread.Sleep ...
- RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件Web业务平台
RDIFramework.NET ━ .NET快速信息化系统开发框架 工作流程组件Web业务平台 接前两篇: RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介 ...
- [翻译] 为什么Uber的数据库从Postgres 切换到 MySql
Uber工程师团队发布了一个重要的博客文章:他们的数据库从Postgres从移动到MySQL.毫不夸张地说,阅读这篇文章是一种享受,特别是因为他们提到这些细节:磁盘格式和那对他们2个数据库的表现的影响 ...
- C 宏定义 理解(1)
- ASP.NET中的Image和ImageButton控件
Image 控件用来显示图形.Image 控件可以显示来自位图.图标或元文件的图形,也可以显示增强的元文件.JPEG 或 GIF文件. ImageButton 控件用于显示可点击的图像. Image ...
- struts 初体验
1. 什么是Struts2 struts2是以WebWork的设计思想为核心,吸收了Struts1的部分有点,建立了兼容WebWork和Struts1的MVC框架. 1.1 WebWork: 强调系统 ...
- RCNN--对象检测的又一伟大跨越 2(包括SPPnet、Fast RCNN)(持续更新)
继续上次的学习笔记,在RCNN之后是Fast RCNN,但是在Fast RCNN之前,我们先来看一个叫做SPP-net的网络架构. 一,SPP(空间金字塔池化,Spatial Pyramid Pool ...
- retain,copy,assign及autorelease ,strong,weak
一,retain, copy, assign区别 1. 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b.此时a ...