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]. 在理解指针数组的使用方式前,我先来说下我个人对数组的理解. 比如一维整形数组(形 ...
随机推荐
- vmware centos下配置ip
使用NAT模式 虚拟机网络连接使用NAT模式,物理机网络连接使用Vmnet8. 虚拟机设置里面--网络适配器,网络连接选择NAT模式. 虚拟机菜单栏-编辑-虚拟网络编辑器,选择Vmnet8 NAT模式 ...
- iptables rule
和H3C中的acl很像,或者就是一会事,这就是不知道底层的缺陷,形式一变,所有的积累都浮云了 参考准确的说copy from http://www.ibm.com/developerworks/cn/ ...
- GIS简单计算Helper类
using System; using ESRI.ArcGIS.Client.Geometry; namespace GISProject.Extensions { /// <summary&g ...
- css巧妙实现分隔线
单个标签实现分隔线 .demo_line_01{ padding: 0 20px 0; margin: 20px 0; line-height: 1px; border-left: 200px sol ...
- linux中非root用户使用wireshark进行抓包
开始的时候我是在终端中使用sudo 命令打开 wireshark 的,因为如果不这样的话 wireshark 就没法抓包啊.偶尔抓一次包就使用这样的方式提权. 今天使用 wireshark 的时候特意 ...
- jquery file upload 文件上传插件
1. jquery file upload 下载 jquery file upload Demo 地址:https://blueimp.github.io/jQuery-File-Upload/ jq ...
- python入门练习题1
常见python入门练习题 1.执行python脚本的两种方法 第一种:给python脚本一个可执行的权限,进入到当前存放python程序的目录,给一个x可执行权限,如:有一个homework.py文 ...
- C#:绘图问题
1.设置DPI Bitmap bitmap2 = new Bitmap((int)w, (int)h); bitmap2.SetResolution(, ); 2.设置Graphic(如:去锯齿等) ...
- 1350. Primary Arithmetic
Children are taught to add multi-digit numbers from right-to-left one digit at a time. Many find th ...
- 两个img之间出现间隙的解决方法
今天写了个小页面,发现了一个问题,两个包在a标签里的img之间总是有间隙,不能挨在一起,最后在同事的帮助下,找到解决的办法是,设置img的基线,css代码如下: img{vertical-align: ...