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

c语言怎样使用数组指针

发布时间: 2022-06-24 09:12:05

c语言——数组指针

(1)用数组——

#include"stdio.h"
intmain(intargc,char*argv[]){
charstr[100],i,j;
printf("Pleaseenterastring... ");
scanf("%s",str);
i=0;
while(str[i++]=='*');
i--,j=0;
while(str[j++]=str[i++]);
for(j-=2;str[j]=='*';j--);
str[j+1]='';
printf("%s ",str);
return0;
}

运行样例:

② c语言数组指针

int (*p2)[5] = &temp;这是一个指针数组;第一个元素存储的是数组temp的首地址;
*p2等价于&temp; **p2等价于temp数组的第一个元素的值1;
*(*p2+i);等价于*(&temp+i),等价于temp[i];

③ c语言中指针怎么使用

1、使用场景

使用指针时,必须将它指向一个变量的地址或者为它分配空间方能使用,如下所示:

#include<stdio.h>

#include <stdlib.h>

int main(int argc, char const *argv[])

{

int a[5]={0,1,2,3,4};

int *b,*d;

int c=2;

int *e=a; //e指向a数组首地址

//*b=2; 无法直接初始化

//printf("%d ", *b);

e=e+2; //移动两个地址单元

d=&c; //d指向c的地址来表示值

c=4; //修改原c变量的值,d指针的值会发生改变

b=(int *)malloc(sizeof(int));//为b分配一个int型空间来直接存储值

*b=2;//分配空间后可以直接赋值了

printf("this is e,b,c,d :%d %d %d %d ",*e,*b,c,*d);

2、类型说明

(1)int *a :表示一个指向int型变量的指针,指向的是变量的地址单元

(2)char *b:表示一个指向char变量的指针

*a表示的是这个指针指向地址的值,a为此指针本身的地址,这点要明确,一般用*(a+1)、*(a+2)来表示值,如:

int nums[5]={0,1,2,3,4};

int *a=nums;

printf("%d %d %p ",*a,*(a+1),a);

(3)c语言怎样使用数组指针扩展阅读:

指针的运算

指针指向变量地址,若原变量的内容发生了变化,它本身也会发生变化,指针之间的运算一般为值运算和地址运算

(1)值运算:直接通过*运算方式,像a+*(a+1),结果为第一个元素与第二个元素相加。

int nums[5]={0,1,2,3,4};

int *a=nums;

(2)地址运算:通过a+i的方式.指针会指向a的下i个地址。

int nums[5]={0,1,2,3,4};

int *a=nums;

a=a+2;

printf("%d ",*a);

结果输出2。

参考资料来源 :指针-网络

④ 请问C语言里一维数组能用数组指针吗如果可以怎么用呢

数组指针可以指向一维数组的。
指针本来就是变量,是用来存放地址的变量。
如:
int (*a)[3],b[12];
a=b;
a++;
之后,*a相当于a[3]

⑤ C语言中,如何定义一个‘指针数组’,这个‘指针数组’专门用来存放‘数组指针’。

指针数组定义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+1;p跨过行a[0][]指向了行a[1][]

(5)c语言怎样使用数组指针扩展阅读:

与数组指针关系

数组指针是指向数组首元素的地址的指针,其本质为指针(这个指针存放的是数组首地址的地址,相当于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&lt;stdio.h&gt;

int main()

{

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

char(*p)[4];

int i;p=c;//将指针定位于c[0]

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

{

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

}

printf(" ");

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

{

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

}

return 0;

}

指针数组:

#include&lt;stdio.h&gt;

int main()

{

int i;

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

for(i=0;i&lt;6;i++){

printf("%s,",pch&lt;i&gt;);

}

printf(" ");

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

printf("%s ",pch&lt;i&gt;);

}

return 0;

}

⑥ C语言使用数组指针参数传递

用指针传递一维数组。
#include <stdio.h>
#include <math.h>
float dist( float *p1, float *p2){
float d[3],ds;
int i;
for (i=0;i<3;i++) d[i] = p2[i]-p1[i];
ds = sqrt( d[0]*d[0]+ d[1]*d[1]+d[2]*d[2]);
return ds;
};
void vec( float *p1, float *p2, float *p3){
int i;
for (i=0;i<3;i++) p3[i]=p1[i]+p2[i];
}

int main()
{
float a[3],b[3],c[3];
int i;
printf("input x y z for point 1\n");
for (i=0;i<3;i++)scanf("%f",&a[i]);
printf("input x y z for point 2\n");
for (i=0;i<3;i++)scanf("%f",&b[i]);
printf("distence: %g\n", dist(a,b));
printf("\n");
vec(a,b,c);
for (i=0;i<3;i++) printf("%g ",c[i]);
return 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语言 指针数组的使用

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

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

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

给你举个例子

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

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

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

⑨ 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),但总体框架就是这样!

⑩ 如何在c语言二维数组中使用指针

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