C语言 如何初始化指针数组 比如char *dd[5]

Python013

C语言 如何初始化指针数组 比如char *dd[5],第1张

char 指针,也就是char *类型。 其初始化本质上与其它变量初始化没有什么区别,就是赋予其一个初始化的值。对于指针来说,在C语言中,就是一个地址。区分初始化情况,有四种表象:1 初始化为空。即char * str = NULL的形式,NULL在C语言中是特定的空指针,其值为0.在C语言中,以NULL作为指针的一个未生效状态,其本身是一个非法的地址值。2 初始化为常量字符串地址。char * str = "test"常量字符串在运行时会被放在常量空间中,于是这样初始化后,地址是常量空间中的一个地址,对于该地址只能读取,不可写入。即str的值可以改,但是str指向的值是不可修改的。3 初始化为变量地址。这里的变量地址,包括全局变量,局部变量的地址,以及通过动态分配申请到的内存地址。这种情况下,对指针指向的空间是可以修改的。4 不做初始化。这种情况在C语言中是允许的。如果为全局变量或静态局部变量,系统默认初始化为0值,即NULL。而对于局部变量,将是一个随机值。所以如果是局部变量不做初始化,在取其指向空间值前,必须为其指定一个合法的值,否则访问会出错。

指针数组定义int*p[n]

[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,

这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样*p=a这里*p表示指针数组第一个元素的值,a的首地址的值。

数组指针定义int(*p)[n]

()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。

如要将二维数组赋给一指针,应这样赋值:

int a[3][4]

int(*p)[4]//该语句是定义一个数组指针,指向含4个元素的一维数组。

p=a//将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]

p++//该语句执行过后,也就是p=p+1p跨过行a[0][]指向了行a[1][]

扩展资料:

与数组指针关系

数组指针是指向数组首元素的地址的指针,其本质为指针(这个指针存放的是数组首地址的地址,相当于2级指针,这个指针不可移动);指针数组是数组元素为指针的数组,其本质为数组。

例如:*p[2]是指针数组,实质是一个数组,里面的两个元素都是指针,[]的优先级比*的优先级高,p先与[]结合,形成数组p[2],有两个元素的数组,再与*结合,表示此数组是指针类型的,每个数组元素相当于一个指针变量

与二维数组对比

二维数组:如char string_1[10][10]只要定义了一个二维数组,无论赋不赋值,系统都会给他分配相应空间,而且该空间一定是连续的。其每个元素表示一个字符。我们可以通过指定下标对其元素进行修改。

指针数组:如char*str_B[5]系统至少会分配5个连续的空间用来存储5个元素,表示str_B是一个5个元素的数组,每个元素是一个指向字符型数据的一个指针。

如果我做这样的定义:

char a[3][8]={"gain","much","strong"}

char*n[3]={"gain","much","strong"}

他们在内存的存储方式分别如右图所示,可见,系统给数组a分配了

3×8的空间,而给n分配的空间则取决于具体字符串的长度。

此外,系统分配给a的空间是连续的,而给n分配的空间则不一定连续。

由此可见,相比于比二维字符数组,指针数组有明显的优点:一是指针数组中每个元素所指的字符串不必限制在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。但是二维字符数组却可以通过下标很方便的修改某一元素的值,而指针数组却无法这么做。

举例编辑

数组指针:

#include&ltstdio.h&gt

int main()

{

char c[][4]={"哥","哥","我","岸","上","走"}//UTF-8:一个汉字=3个字节

char(*p)[4]

int ip=c//将指针定位于c[0]

for(i=0i&lt=5i++)

{

printf("%s,",*(p+i))//或者将*(p+i)替换成*p++

}

printf("\n")

for(i=5i&gt=0i--)

{

printf("%s,",*(p+i))//或者将*(p+i)替换成*--p

}

return 0

}

指针数组:

#include&ltstdio.h&gt

int main()

{

int i

char*pch[6]={"妹","妹","你","坐","船","头"}

for(i=0i&lt6i++){

printf("%s,",pch&lti&gt)

}

printf("\n")

for(i=5i&gt=0i--){

printf("%s\n",pch&lti&gt)

}

return 0

}

参考资料:

百度百科——指针数组