当前位置:首页 » 编程语言 » c语言数组的指针用法
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言数组的指针用法

发布时间: 2022-08-07 08:03:24

‘壹’ c语言 指针数组的使用

int**a可以表达一个二维数组。为什么呢?

你可以这么理解*p[3]表达的是一个数组指针,这个指针p[0]表示的是数组存的第一个地址。而数组实际上是一串连续地址的块。每一个小块存着一个内容。每次访问数组时,你为什么可以用数组名+下标访问呢?//比如a[i];

实际上就是访问*a+i;*这个符号可以表示你存的是变量的地址。而数组地址的第一位为int类型变量存的地址(你可以直接使用数组的地址加上单位变量的空间的大小去访问下个元素)。在这个程序中int*p[3]表示可以存三个int类型的地址。而p正好把二维数组的三个一维数组的开头的int类型变量的地址给存起来了。

给你举个例子

实际上p[i]与 *(p+i)是表达的是同一个意思。只不过只有数组可以定义一个连续的空间

(数组的第一个地址是随机的其他的是连续的。)单独用指针的话会随机分配的

数组的指针可以存三个地址。当然可以访问二维数组了。

‘贰’ 如何正确地使用C语言的指针

指针是C语言中的精髓,它能直接对物理地址进行访问,具有双重功能,是嵌入式设计中必不可少的一门语言。C语言功能强大的主要原因就是具有指针结构。指针是一种特殊的数据类型,直接指向目标的存储地址,实现直接访问对象存储空间的功能。
1、指针指向变量:
下面有这样一个代码块:
int main()
{int a=10;int b=15;test(a,b);printf("a=%d,b=%d\n",a,b);}
void test(int x,int y)
{int tmp;tmp=x;x=y;y=tmp;}
最后输出的结果还是a=10,b=15。因为在函数调用时,实参和形参之间只是值传递。但我们使用指针结果就不一样了,如:

int main()
{int a=10;int b=15;test(&a,&b);printf("a=%d,b=%d\n",a,b);return 0;}
void test(int * x,int *y)
{int tmp;tmp=*x;*x=*y;*y=tmp;}
输出结果a=15,b=10。变量a和b的值发生了交换。这是因为我们利用指针访问变量的存储单元,间接修改变量的值。
2、指针指向数组:
定义一个数组并初始化,int array[5]={2,5,12,7,8},定义一个指针变量并把数组的地址赋给它,int *p=array,注意数组名就是数组的地址,而且数组的地址就是首元素的地址。因此我们的指针变量就指向了数组的首元素,*p=2。如果把(p+1),那么指针变量就指向了数组的下一个元素5,因此我们可以利用指针来遍历数组的各个元素:
int main()
{int array[5]={2,5,12,7,8};int *p =array;for(int i=0;i<5;i++){printf("array[%d]=%d\n",i,*(p+i));}return 0;}
3、指针指向字符串:
我们都知道用数组存储字符串,如char name[20]="jack",上面已经简单讲述了指针指向数组,所以我们可以这样做,char *name="jack",指针变量指向字符串的首个字符并可以依次访问字符串的各个字符。
4,指针指向函数:
我们需要知道怎样表示一个指针指向函数,说白了就是语法要正确,下面我也取一个代码块来说明一下:
int sum(int x,int y)
{return x+y;}
int main()
{int a=5;int b=6;int (*p)(int,int);p=sum;int result=(*p)(a,b);printf("The result is %d\n",result);return 0;}
不难发现上面代码块里语句(*p)(a,b)可以用p(a,b)来代替,因为p和sum就是一样的,只是用前者可能更容易理解一点。而我们要知道怎样定义一个指针指向函数,int (*p)(int,int)这是固定写法,前面的int是指针将来指向的函数的返回值的类型,如果没有函数返回值,那就是void,后面括号里的两个int 当然就是指针将指向的函数的形参。指针指向函数用起来确实有点抽象,要想熟练运用的话就多去做一些这方面的练习吧!
5,指针指向结构体:
我们首先首先定义一个结构类型,
struct student
{
char *name;
int ages;
};
再根据类型定义结构体变量 struct student stu={"Rose",15};定义一个指针指向结构体类型,struct student *p;把结构体变量stu的地址赋给指针变量p,p=&stu;我们可以有3种方式来访问结构体中的属性ages:
stu.ages=15;(*p).ages=15;p->ages=15;不过第三种方式在C语言中只能用来指向结构体。
综上所述,指针的基本用法就是这几种,还有些用法不常见的在此就一一例举了,有兴趣的话可以去翻阅相关的资料。

‘叁’ C语言中关于指向数组的指针

char str[100];
char *pi=str; //相当于char *pi ;pi=str;
char **ppi=*pi;//这个地方抄错了。应为char **ppi=&pi;
定义加*表明这是指针类型的变量
用的时候,就是用的指针,加*干什么。
只有取指针所指变量的值,或给指针所指的变量赋值的等涉及指针所指的变量的时候,
才会又加*号,表示获取或改变,指针所指变量的值。
char x=10;
*pi =x; //给指针所指的变量赋值,改变指针所指变量的值(改变*pi) 。
x=*pi; //取指针所指的值,取指针pi所指的变量的值(表示为*pi)赋值给x。

‘肆’ c语言指针数组

p是int类型指针,指向数组a的第1个元素即一个一维的数组{1,2,3}首地址所以p[1]相当于a[0][1]所以printf("%d\n",p[1]);
输出2 。 int **pp =pa 是声明了一个指向pa的指针,而pa又是指向a首地址的int类型指针。pa指向的是a的第一维,pa[0] = a[0] ,pp[2][1]相当于a[2][1]而a数组的[2]中只初始化了[2][0]位置的7,那[2][1]位置就是默认的值0,所以printf("%d\n",pp[2][1]);
输出0

‘伍’ c语言数组指针

② 指向iArray[1]输出2 (因为*(++p)是先自加然后取指针内容)
③ 指向iArray[1]输出4 (因为②时p已经成了1,p+2就是3,iArray[3]就是4)
④ 指向iArray[0]输出2 (因为*(p--)相当于 *(p) ;p--; 是先取值, 然后自减,自减后p=0)
/******
④有异议 不管怎么样, 输出的都是2 ,因为假如是 printf("%d",$(p--)); 则是 printf("$d,$p");p--; 就是输出的时候, p是指向iArray[1], 但是输出后就变成了指向iArray[0]了,-----------这里问的p指向:如果是输出时的指向, 就是iArray[1],如果是输出后的指向, 就是iArray[0] ,因为这里先问的输出,又问的指向,所以当作是输出后指向 所以是iArray[0]
*******/
⑤ 指向iArray[0]输出1 (因为*p++ 是得到p指向的值之后,把那个值自加 ,但是*p++是先使用*p然后*p自加所以输出的时候还是*p的内容 ,但是注意, 这时*p已经是2了,也就是iArray[0]从1变成了2)
⑥ 指向iArray[0]输出2 (因为p是指向数组的索引0的位置,⑤中指针位置没变,变得是里面的值,本来是1, ⑤之后变成了2)
⑦ 指向iArray[0]输出3 (因为++(*p)是取出*p之后, 自加, 然后输出,所以*p是2 2++是3)
⑧ 指向iArray[0]输出3 (⑦中没改变指针, 只改变了指针指向的位置的值, 是⑦中2++的结果,是3)

/*
这里考验的是i++ 和++ i的区别
比如 a=i++; 相当于 a=i; i++;
而 a=++i ; 则相当于 i++;a=i;
一个是先赋值再递加,一个是先递加再复制
另一个是考*p++和*(p++)的区别, *p++改变的是*p的值就是指针指向的值 , 而*(p++)改变的是p的值
*/

‘陆’ 如何在c语言二维数组中使用指针

程序中有些问题:
1、函数的定义有错误(参数格式不对);
2、程序中没有调用函数(或者说是调用格式有误)
3、函数中的处理逻辑需要修改(一步一步来,这样容易处理和理解)。
你定义的函数是使用数组作为参数的,数组名本身就是个地址(相当于指针)。
下面在手机上用易历知食软件里的微C程序设计来演示修正后的代码并运行程序,供参考。
手机上修正后的代码如下图:
手机上运行的效果如下图所示:

‘柒’ c语言中数组指针的表示方法

(*k)[3]意为指向包含三个整形元素的一位数组;
*k[3]意为一个数组,数组的每个元素都是一个指针
以下为实例:
#include <stdio.h>
#include <conio.h>
void main(void)
{
int (*p)[3];
int a[2][3]={1,2,3,4,5,6};
p=a;
//假设我们想输出第二行,第三个
printf("%d",*(*(p+1)+2));
getch();
}
#include <stdio.h>
#include <conio.h>
void main(void)
{
int *p[3];
int a=0,b=1,c=2;
p[0]=&a;
p[1]=&b;
p[2]=&c;
printf("%d,%d,%d",*p[0],*p[1],*p[2]);
//输出结果为 0,1,2
}
不懂再问

‘捌’ c语言中的数组指针

这时b代表数组第一个元素b[0][0]的地址,*b就是b[0][0]的值
1.
*b+1表示b[0][0]+1的值
2.
*(b+1)
首先地址b加一,此时就是b[0][1]的地址,故此表达式相当于*(&b[0][1]),也就是b[0][1]的值
3.
*(b+1)+1
由上面知此式表示b[0][1]的值加1

‘玖’ C语言数组指针

1数组指针强调是一个指针,这个指针指向的是一个数组,把数组名给这个指针就是对数组指针赋值了。
2二维数组里的每个元素是什么要看你把这个二维数组定义成什么类型,例如:char num[3][3],数组里每个元素是为char类型开辟的那么大的一块内存,可以存char类型数据。二维数组名是整个二维数组的首地址,a=&a[0]=&a[0][0]=a[0]值都是二维数组的首地址的值。
指针数组名是一块开辟好的内存的首地址,是常量,比如a[0],指向数组的第一块内存区域,那块内存区域里是可以赋值的,明白了吧。
char *ss[6];ss[1]="right?"这句先定义一个char类型的指针数组,强调是一个数组,里边的元素是指针,指针是指向char类型数据的,ss[1]是指针数组的第二个元素,是一个指针,指针的指向是“right”字符串的首地址。
char ss[6][20];ss[1]="right?"是定义一个二维字符数组,横6纵20,起迷惑作用的!二维数组里ss[0], ss[1]等代表的是第一行,第二行的首地址,ss[0][3]是第一行第四个元素,ss[1][3]代表第二行第四个元素。
3第三个问题再用我讲你就直接改行吧!!哈哈哈
祝你学习进步!!

‘拾’ C语言数组指针的具体用法

同意楼上!
不能定义*d[0],因为这个数组的大小为0!
可以这样来
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *d[4];
d[0]=malloc(1*sizeof(char));
strcpy(d[0],"web");
printf("%s",d[0]);
return 0;
}
此时*d[]为一个指向指针的指针
d[0]=malloc(1*sizeof(char));
此句话的意思是,分配1个字节的内存空间给d[0],也就意味着d这个数组的第一个元素[0]内保存的是一个1字节空间的地址,因为d[0]指向一个地址!

你可以这样理解
对于普通的数组(例如 char d[4];),在内存中是这样的
变量:内存地址:内容
d[0]:0x400000h:'w'
d[1]:0x400001h:'e'
d[2]:0x400002h:'b'
d[3]:0x400003h:'\0'
而在此处 char *d[4]; *d[0] = malloc(1*sizeof(char));,是这样的'
d[0]:0x400000h:0x400100h
d[1]:0x400001h:0x400101h
d[2]:0x400002h:0x400102h
d[3]:0x400003h:0x400103h
而在内存0x400100h处
才保存着"web\0"

不好意思,我上面说错了,应该是
d[0]:0x400000h:0x400100h
d[1]:0x400001h:NULL
d[2]:0x400002h:NULL
d[3]:0x400003h:NULL
而在内存0x400100h处
0x400100h:'w'
0x400101h:'e'
0x400102h:'b'
0x400103h:'\0'

对应的,你的代码执行后,内存变量应该是这样的
d[0]:0x400000h:0x400100h
d[1]:0x400001h:0x400104h
d[2]:0x400002h:0x400108h
d[3]:0x400003h:NULL
在内存0x400100处:
0x400100h:'w'
0x400101h:'e'
0x400102h:'b'
0x400103h:'\0'
0x400104h:随机字符
......
0x400108h:随机字符

以上内存地址是以字节方式内存对齐的,用一些编译器编译后可能地址会有些问题(比如d[0]到d[1]不止差了4,可能是8),但总体框架就是这样!