您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
c语言中的指针数组
发布时间:2021-04-13 21:20:49编辑:雪饮阅读()
指针数组从字面意思即可了解到其是以指针做为数组元素而形成的数组,那么c语言中常见的指针数组是char型的,当然这里将会模拟实现一个int型的指针数组。
且看char型的指针数组的实现:
char.c:
#include <stdio.h>
const int MAX = 4;
int main ()
{
//指针数组定义 *指针数组名[]={引用值1,引用值2,引用值3...,引用值n}
const char *names[] = {
"Zara Ali",
"Hina Ali",
"Nuha Ali",
"Sara Ali",
};
/*
上面的指针数组定义你可以这样理解:
char *str0 = "Zara Ali";
char *str1 = "Hina Ali";
char *str2 = "Nuha Ali";
char *str3 = "Sara Ali";
char *names[4] = {str0, str1, str2,str3};
所以其本质就是取每个元素的指针形成一个数组
那么这里你可能还会有一个疑问:
为什么char类型可以被赋予string类型的值?
其实这考虑到在C语言中,没有专门的字符串型数据类型,而是把字符串看成一个特殊的字符数组。
其特殊性只不过是在字符数组后面加了一个 \0 。
你若把它看成数组,就很容易理解了吧
*/
int i = 0;
for ( i = 0; i < MAX; i++)
{
//由于我们这里指针数组元素实质上是string类型,所以这里输出值的时候需要%s输出,那么引用地址则是%p输出(%p即指针pointer)
printf("Value of names[%d] = %s address:%p\n",i,names[i],names[i]);
}
return 0;
}
然后我们再来看看int型数组的模拟实现:
Int.c:
#include <stdio.h>
const int MAX = 4;
int main ()
{
/*
看到char类型指针数组的实现,那么如果要实现int类型指针数组是否只需要替换下指针数组类型,并把指针数组里面每个元素都用int值即可,如:
int *ptrs[]={10,100,200,400};
实际上不能这样写,因为*ptrs[]表示接收的是一个指针数组,而{10,100,200,400}数组的元数是直接存储于栈内存不用像字符类型一样需要用指针去指向堆内存
C语言中指针数组通常是用来构成字符串数组,所以也被称字符串数组。
那么是否可以这样实现:
int *ptrs[]={&10,&100,&200,&400};
实际上这样也是不可行的:
取址运算符的操作数必须是在内存中可寻址到的地址。换句话说,该运算符只能用于函数或对象(例如左值)
而这边&10,&100,&200,&400这些操作数都是右值,都是int的字面常量所以自然是不可以的
那么正确的实现方式如下:
*/
//那么正确的实现应该是这样:首先我们要为每个int元素实现一个左值
int a=10;
int b=11;
int c=12;
int d=13;
//有了左值我们才可以声明定义这个int型指针数组
int *ptrs[]={&a,&b,&c,&d};
int x = 0;
for ( x = 0; x < MAX; x++)
{
/*
这里的*ptrs[x]作何解释?为什么char实现的时候不需要呢?:
首先*表示指针类型,同时还有一个作用就算可以解除&的引用:
当已具有一个指针,并且希望获取它所引用的对象时,使用间接运算符 *(indirection operator),有时候这会被称为解引用运算符(dereferencing operator)。它的操作数必须是指针类型。
那么为什么刚才char实现的时候不需要解除这个引用呢?
因为char实现时候指针数组元素都是string的引用,而输出类型%s正好也可以接收这个sting的引用(个人理解)
但是这里因为我们最终输出的元素是10、11、12、13这种int值,用%d,%d如果直接给一个指针(引用)肯定是不行的
如果是%d输出,则如printf("%d",&a);将会输出不会报错,但是输出结果就不是10了,是一个很奇怪的值,个人认为这个值应该是a的指针地址转换为int型的数值了
可以测试下:
printf("%d\n",&a);
printf("%p",&a);
会发现这里%d将指针直接输出就是指针地址(16进制)转换为10进制的值
*/
printf("Value of ptrs[%d] = %d address:%p\n",x,*ptrs[x],ptrs[x]);
}
return 0;
}
关键字词:指针,指针数组,字符,int,char
下一篇:c语言实现从函数返回数组