指针——C之精华(续1)

本文深入探讨了C语言中指针的基本概念、数组名作为函数参数、多维数组与指针、字符串与指针的关系,以及字符数组的输入输出方法。详细解释了指针的操作方式、字符串的表示和处理技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1)、先取*p值,后使p值加1:*p++与*(p++)等价。(++和*同优先级,结合方向自右而左)

2)、先使p值加1,后取*p值:*(++p


1、用数组名做函数参数

C编译时将形参数组名作为指针变量来处理的,所以以下2个函数的定义是等价的:

f( int arr[] , int n )

f( int *arr , int n )


2、多维数组与指针

int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};

a     代表首行(第0行)的首地址,即&a[0][0];a+1代表第1的首地址;

a[0] 代表首行(第0行)的首地址,即&a[0][0];a[0]+1代表第0行第1列的元素的地址;

       a[1]和*(a+1)等价(&a[1][0]);a[1]+1=*(a+1)+1=&a[1][1]

<span style="font-size:14px;"><span style="font-size:14px;">#include<stdio.h>
void main()
{
	int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
	int *p;
	for(p=a[0];p<a[0]+12;p++)
	{
		if((p-a[0])%4==0)
			printf("\n");
		printf("%4d",*p);	
	}

	printf("\n");
}</span></span>

3、字符串 与 指针

1)、在C中,字符串是被当做字符数组来处理的。

字符串结束标志:'\0'  (ASCII值为0,即空操作字符NUL)


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


char c[10]={'I',' ','a','m',' ','h','a','p','p','y'};

char c[ ]={"I am happy"}; 或 char c[ ]="I am happy";

都是定义字符数组,但是前者数组长度是10,后者长度是11(因为字符串常量的最后由系统加上了一个'\0');

char c[ ]={"I am happy"}; 或 char c[ ]="I am happy";

char c[10]={'I',' ','a','m',' ','h','a','p','p','y','\0'};等价

为了使处理方法一致,在字符数组中常常人为地加上一个'\0'。这样做,便于引用字符数组中的字符串。

例如:

char c[]="Pascal program";

若想用一个新的字符串代替原有的字符串,从键盘向字符数组输入:Hello

如果不加'\0'的话,字符数组中的字符如下:

Hellol program


2)、字符数组的输入输出

两种方法:

1)、%c:逐个字符输入输出

2)、%s:整个字符串

例:

char c[]="China";

printf("%s",c); //注意输出项是字符数组名


输入字符串时,系统把空格字符作为输入的字符串之间的间隔符

例:

char str[13];

scanf("%s",str);

如果输入以下12个字符:

How are you?

只有how和\0被保存到str中。


·3)

访问一个字符串的方式有2种:

(1)、字符数组存放一个字符串

char str[]="I love China!";

对字符数组智能对各个元素赋值,不能用以下办法对字符数组赋值:

char str[14];

str="I love China!";

数组可以在定义时整体赋初值,但不能在赋值语句中整体赋值

(2)、用字符指针指向一个字符串

char *str="I love China!";  (实质是把字符串第一个元素的地址赋给str,不要误以为把字符串赋给str)

char *str;

str="I love China!"    (特别注意不是*str  !!  因为实质赋值的是地址)

等价


2)、字符指针作函数形式参数

1、字符数组作函数形参

char a[]="I am a boy";

char b[]="You are a engineer";

char *c=a;

char *d=b;

void  function ( char from[] , char to[] ) 

  a、字符数组作实参

function(a,b);

b、字符指针变量作实参

function(c,d)

2、字符指针变量做函数形参

char a[]="I am a boy";

char b[]="You are a engineer";

char *c=a;

char *d=b;

void function( char *from, char *to);

           调用:

function(c,d);


注意:

1、指针变量的值是可以改变的,而数组名虽然代表地址,但它是常量,它的值是不能改变的;

void main()

{

char *a="I love China!"

    a=a+7;

printf("%s",a)

}

输出结果:China!

而以下是错误的:

char a[]="I love China!";

a=a+7;

printf("%s",a);


2、避免不可预料的情况。

char str[10];

scanf("%s",str);

是可以的,但是下面的是危险的:

char *str;

scanf("%s",str);

因为&str虽然分配了,但是str的值是不可预料的,随意改变可能破坏系统。

可以这样做:

char *a, str[10];

a=str;

scanf("%s",a);





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值