c语言字符二维数组指针赋值,C语言【指针】二维数组和字符串与指针的关系

指针与多维数组

多维数组地址的表示方法:

二维数组s[3][4]定义int s[3][4]={ {0,2,4,6},{1,3,5,7},{9,10,11,12} }

8520eb7039e27a00dfd65ca4347bd8a7.png

根据以上的一个二维数组的例子,就有如下表示:

ffa27d10bc4d8fcbc9cd022f037c6b35.png

注意:S代表着二维数组的首地址,s+1代表第一行的首地址,而s[1]代表着第一行第一列的地址,虽然s+1和s[1]都是代表着同一个地址,但是他们还是有区别的。比如:*(s[0]+1)是访问第0行第1列的值,既然s=s[0],那么*(s+1)是访问第0行第1列的值这种说法是错误的,因为s+1,s,s+2是每一行数组的首地址,不牵扯到列的概念,所以是行操作。需要进行行转列,将s视为由s[0],s[1],s[2]组成的一维数组,那么,s[0]=*(s+0),所以s[0+1]=*(s+0)+1=&s[0][1],即s[i]+j=*(s+i)+j=&s[i][j]。

总之:s[1]=s+1是地址上的相等,操作上是不相等的。而

S[1]=*(s+1)不仅地址是相等的,操作也是相等的。

指向多维数组的指针变量 实例#include

main()

{

int a[3][4]={{0,2,4,6},{1,3,5,7},{9,10,11,12}};

int *p;

for(p=a[0];p

{

if((p-a[0])%4==0) printf("\n");

printf("%4d",*p);

}

}

a0739ce84854026220c90387108eab06.png

指向由m个元素组成的一维数组的指针变量 实例#include

main()

{

int a[3][4]={{0,2,4,6},{1,3,5,7},{9,10,11,12}};

int (*p)[4],i,j; //数据类型为(*p)[m],p是一个指针变量,指向包含m个元素的一维数组;

//p指向的是横坐标的第一个,p+0地址中的值是0,p+1的值是1,p+2的值是9。

p=a;

printf("请输入要输出的数组坐标");

scanf("%d,%d",&i,&j);

printf("s[%d,%d]=%d\n",i,j,*(*(p+i)+j));//*(p+i)+j是行转列。

}

967def48402b60a0887a71d8dc35f2b5.png

指向多维数组的指针作为函数参数。实例

题目:一个班有3个学生,各四门课程,计算总平均分数和第n个学生的成绩。#include

main()

{

void average(float *p,int n);

void search(float (*p)[4],int n);

float score[3][4]={{65,75,54,80},{78,90,89,76},{66,76,87,90}};

int n;

average(*score,12);

printf("enter a number to n:\n");

scanf("%d",&n);

search(score,n);

}

void average(float *p,int n)

{

float *p_end=p+n,aver=0;

for(;p

aver=aver+*p;

aver=aver/n;

printf("Average=%7.2f\n",aver);

}

void search(float (*p)[4],int n)

{

int i;

for(i=0;i<4;i++)

printf("%7.2f",*(*(p+n)+i));

}

65a8a1cf418ef5644ca746185941c00b.png

指针与字符串

字符数组

#include

main()

{

char string[]="I am a student";

printf("%s\n",string);

}

f2b2485e7148deb94edefd6307a934eb.png

注意:(1):字符数组的长度要加上最后的结尾标志(“\o”);

(2)string数组名代表数组首地址,string+4表示第4个元素的地址

(3)%S表示整体输出,%X表示16进制输出,%C是一个字符。如果是%d,则输出的就是地址。

字符指针#include

main()

{

char *string="I am a student"; //char a[]=” ”,*string; string=a

printf("%s\n",string);

}

fcac20f1de54a57401f135e8c163c013.png

string是指向字符串的指针变量,存放了元素首地址,*在此毫无意义,表示指针类型。

字符数组与字符串指针的区别

(1)存储方式:字符数组:分配一个存放元素的单元。

字符串指针:分配一个存放元素地址的单元,地址指向元素首地址。不

是将整个字符串放到字符指针变量中。

(2)赋值方式:

字符数组:char str[16]={“a,b,c”}

字符串指针:char *str=”abc”char *str; str=”abc”;

(3)定义方式:

字符数组:char str[10];scanf(“%s”,str);

字符串指针:char *str,a[10];str=a;scanf(“%s”,str);指针str必须得指向一个数组,

不然就是野指针了。

(4)运算方面

字符数组:字符数组名是常量,不能进行运算,不能改变值。如:

char a[]=”abc”; a=a+1;这是错误的。

字符串指针: 指针变量的值是可以改变的,可以进行运算,如++,==等操作。

如:char *a=”abc”; a=a+1;这是正确的

字符串指针作为函数参数#include "stdio.h"

#include "string.h"

void inv(char *s)

{

for(;*s !='\0';s++)

{

if(*s>=65 && *s<=90)

*s+=32;

else if (*s>=97 && *s<=122)

*s-=32;

}

}

main()

{

char *string,a[10];

string=a;

gets(string);

inv(string);

puts(string);

}

6c6b03a0a0c64f21bc36045f12853aed.png

这个程序是大小写转换的一个程序 。注意结束标志“\0”中的0是数字0,而不是字母o .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值