指针2(真的不能在详细了)

一维数组与指针,指针的取值和移动问题;

目录

基础介绍

取值和移动问题


基础介绍

#include<stdio.h>
int main()
{
char  a[20]="China",b[20];
char *p1,*p2;
scanf("%s",b);//切记这里输入时,b前不要加'&'符号;
p1=a;
p2=b;
printf("%s,%s,%s,%s",p1,p2,a,b);//这里也是一样的。
return 0;
}

a代表的是数组中第一个元素的地址,而p又指向a中元素的第一个地址;

就有     a[2]=P[2]   的这种关系组中。他们都表示为a数组中第3个元素。

因为一维数组字符串在进行‘%s’的输入和输出时,都是直接引用第一个字符的地址,然后依次输入和输出 。所以在输入和输出的时候不需要再加上‘&’取地址符。

切记不要加'&'符号,虽然有的编译器不会出错,但是根源上理解这并不是一个正确的格式,因为再输入时是地址输入,b本身就代表第一个字符的首地址,所以再加取地址符号,就会冲突。

如果要非要加上'&'取地址符,我们可以这样来运行;

int i;//定义一个整型变量i;
For(i=0;i<5;i++)
scanf("%c",&a[i])//因为这里表示a数组中第i个字符,所以可以加上取地址符依次赋值;

因为a代表第一个元素的地址,所以a+1就代表下一个元素的地址,那也同理p+1;也就是代表下一个元素的地址,所以当进行;

printf("%s",p+1);  //输出结果为hina;
print("%s",a+1);//同理;

当清楚的理解这个概念以后,我们就可以进行下一步的运用

因为地址是一个常量,所以我们就可以进行,地址差值的运算。

当然这里的差值是指两个指针指向同一个数组,这样才能进行差值的计算。

比如

int  a[2][3]={1,2,3,4,5,6},*p1,*p2;
p1=a[0];//让p1指向第一层第一个元素的地址;
p2=a[1];//让p2指向第二层第一个元素的地址;
printf("%d",p1-p2);

输出结果为:3

因为指针存放的是地址,所以同一个数组的地址,是可以进行高低地址的取差值的,如果相加的话,其实并没有多大的意义,因为你不知道计算机给它分配到哪一个地址单元里去了。所以,我们这里只进行差值的计算。

取值和移动问题

*p++   *(p++) 的运算方式是一样的,因为‘*’和‘()’都是单目运算符,是右结合;都代表这取p所指地址的内容后,p+1,也就是地址加一。(字符串数组的话直接用p即可不用带‘*’符号)

如:

char a[20]="CHINA";
char *p1;
p1=a;
printf("%s\n",p1++);
printf("%s",p1);

输出结果:

CHINA

HINA

这里要注意*p++和(*p)++的区别(因为++*p*++p比较容易理解,所以就不做过多的的解释了),一个是取内容后地址加一,一个是取内容加一,使内容改变。下面看个例子:

#include<stdio.h>
int main()
{
int a[3]={5,0,2},
b[3]={5,0,2},*p1,*p2;
p1=a;p2=b;
*p1++;(*p2)++;
printf("%d\n%d",*p1,*p2);        
}

输出结果为:0

                    6

       此时指针p1的指向是a[1],也就是0,而p2的指向还是b[0],指针p2并没有移动,而是,将其所指向的内容进行加一改变。这里可能有小伙伴会有疑问了,那如果是有赋值或者运算等条件,那到底是先进行赋值还是加加呢。这里我们在看一个例子;

int x,y,;
x=*p1++;y=(*p2)++;        
printf("%d  %d\n",x,y);
printf("%d  %d",*p1,*p2);

输出结果为:5  5

                    0  6

相信看到这里小伙伴们的心里应该有了答案。就是先进行赋值,然后进行加加的运算因为,如果'++'在变量的后面就是先用后加,为什么'*'进行运行而'++'没有运行呢,按道理来说,他们两个是同级运算符,为什么会这样呢?并且,当进行完赋值以后,(*p2)++;又进行了一次取内容,然后加加。然后,我通过请教@ZackSock大神和几次测试得出了结论:

       我们可以先把这个'++',先忽略掉,在因为在前面说过,他是先用然后进行加加,所以我们可以先忽略掉它,看其他的内容,都是取地址内容,所以,一开始他们的值都是相等的。进行完赋值以后开始进行式子的加加运算因为'()'的优先级要高于'++',所以会先进行括号里面的内容然后加加,  它最后加的也就是执行完括号里面的内容

       同理如果要是有比'()'优先级更高的就会去执行它了,然后就依次按照优先级高低去排列了,因为'*'只是单纯的取值运算符,所以,p1也是进行了加加后取值,但是并没有变量让他赋予,那也就是没什么用了;

简单来说就是p1指针移动了,但指向的值没有变,p2指针没有移动,指向的值变了

好了就是这么多的内容。下面留一个小例题,让大家进行练习。

int x,y,z=3,i=3;
x=z++;y=(i=z)++;
printf("%d  %d\n",x,y);
printf("%d  %d",z,i);

好了以上就是本章内容,如果有写的不对的地方,欢迎指正和修改。谢谢大家。

猜你喜欢

转载自blog.csdn.net/weixin_67118900/article/details/123604095