C语言之指针与数组总结

同指针相关的题材口诀1

1.
地址变量得地方,得谁地址指为谁

及指针相关的题目而画: 内容变量画房子,指针画箭头

—->口


同指针相关的一定量个与众不同运算符:

同、”&” 取地址运算符,通过&运算符可以取出普通变量的地址;

二、”*”  有些许栽意义:

   1.  吗指针标志: 是否也指针标志主要关押前面是不是有型,此处有一个int

   2.  啊指针运算符:

     在当号右侧为取值。*好取出指针变量所对的屡见不鲜变量的价。

    
在齐号左面为赋值。*得拿指针变量所对的通常变量的值,修改为外。

        口诀2有*
为情节值,不是读就是描写。等号左面为赋值, 其余都也取值。

   3.  乎乘法运算符。当且仅当左右的还为变量时。略。

int a, b =20, c=30, d=40, *p;
(正确,此处的*啊指针标志,只由及定义之横,没有取值和赋值的来意。是否也指针标志主要看前面是不是发生项目,此处最前面来一个int)

p=&d; (正确,p指向d的地址)

a=*p;  (正确,此处的*否取值。最后结果a的价值变为了d的价值40)

*p =c; (正确,此处的*也赋值。最后结果d的值变为了C的值30)

*p =&b; (运行错误,左边为情节值,右边为地方,不抵)


及指针相关的等价表达式

如果指针变量p指向变量a,即将变量a的地方给给了指针变量p.

如:int a=20, int *p=&a;

虽说有如下结果:

A、*p <=> a

B、 p <=> &a

C、 &*p <=> &a <=> p

D、*&a <=> *p <=> a

E、 (*p)++  a++ 

     (*p)–  a–    

     ++(*p)  ++a   ++*p   

      –(*p)  –a   –*p

足见到 * 和 & 是互逆的片个运算符


富有的指针变量在内存中分红的字节数相同 sizeof(指针) 永远是 两单字节,
不管指针定义时是 int *, float * 还是 double * . 详细如下

int *p1;   则 p1以后得借助为int 类型的变量。  
但指针本身的长,sizeof(p1) 为2只字节(2*8bit -16bit)

float *p2;   则 p2以后必须指向float 类型的变量。  
但指针本身的长,sizeof(p2) 为2只字节(2*8bit -16bit)

double *p3;   则 p3之后得对double 类型的变量。  
但指针本身的长,sizeof(p3) 为2独字节(2*8bit -16bit)


季鸣例题:

例子1.

void fun (int *x , int *y) {
  printf(“%d, %d”, *x, *y) ;
  *x = 3;
  *y = 4;
}

main()
{
int x = 1, y = 2
fun(&y, &x);
printf(“%d, %d”, x, y);
}

结果
2, 1
4, 3

注意main在调用fun函数时, y 和x故意写颠倒了。

 ————————————————————–

例子2. 

#include <stdio.h>
void swap(int *p1, int *p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}

main()
{
int a, b;
int * p1 = &a, *p2 = &b;
scanf(%d %d, p1, p2);
swap(p1, p2);
prinf(“%d, %d”, *p1, *p2);
}

假若以支配高输入  2 和 5

则输出结果吗 

5, 2

故: 在调用swap函数时行使了职称,所以于swap函数内部对p1,p2
所引用的内容值的改,会潜移默化之外的a和b的价。

 ————————————————————–

例子3:

#include <stdio.h>
void swap(int *p1, int *p2)
{
int *temp;
temp = p1;
p1 = p2;
p2 = temp;
}

main()
{
int a, b;
int * p1 = &a, *p2 = &b;
scanf(%d %d, p1, p2);
swap(p1, p2);
prinf(“%d, %d”, *p1, *p2);
}

同2不同,
swap函数中的temp为指针,temp=p1使得temp指向了2,p1=p2使得p1指为了5,p2=temp使得p2指于了5.

然结尾的打印结果以为
2,5

因是:虽然main中调用swap函数时采用了指针传递,但swap函数中的有所操作都是:将指针本身的改动,而尚未再次以*操作符来修改“指针指向的内容值”

口诀3:没有*的指针操作为地址,地址之赋值意味着反对。


例子4:

#include <stdio.h>
void swap(int *p1, int *p2)
{
int *temp;
*temp = *p1;
*p1 = *p2;
*p2 = *temp;
}

main()
{
int a, b;
int * p1 = &a, *p2 = &b;
scanf(%d %d, p1, p2);
swap(p1, p2);
prinf(“%d, %d”, *p1, *p2);
}

及2老大像。但唯一不同是,temp定义也指针而无是司空见惯变量。看上去似乎理所应当和2的出口结果同样,仍为
2,5 。

可是实际运作时编译器会报错:非法的内存写入。

原因是:temp为野指针,并没订指于乌。如果依靠为系统区,则恐引致操作系统死机或崩溃。

设temp在概念后,马上让一个新开始值,就非会见发出问题了。

 ———————————————————————

指南针、数组的等价符号

使将数组作为形参,则以反复组名作为指针变量来处理。

int fun(int a[10]) <=> int fun(int *a) <=> int fun(int
a[])

得看到,口诀4:
 &与*互逆。 *与[]等价, &与[]互逆

 

例子5:

int s[10], a, b;
in d[3][6];

 

int *p;
p=&a; //p 指向了整数a
p = &s[2]; //p指向了s数组的第二单元素
p= &d[2][4];////p对了d数组的亚实行、第四排的素。

故而,以上的言语都是本着之。

 

点的例子:

  1. 概念了一个int s[10];   则 s等同于 &s[0].  
    即,看到一个频组,就即联想到他意味着的是几度组第一单要素的地址。

    在C语言中规定,数据称代表数组的首地址,并且是一个地方常量

  1. 此外,如果定义了一个指针 int *ppp = s;  则   ppp 定价为s,
     同时等价于 &s[0]。

 ———————————————————————

指南针的加减:

当指针变量指向数组中之有一个地点时,指针变量加1后依为数组的产一个要素,
指南针变量减1时针对数组的面前一个素。

 例子6:

 

float a[10]; float *p;
p=&a[4]; 则p-3指向?

先画图:

a[0] | a[1] | a[2] | a[3] | a[4] | …

p的开始位置指向了 a[4],  则 p-3 为向前3个,指向了 a[1]

 口诀5:
 指针的加减是无止境或者朝向后倒了n个元素

 ———————————————————————

int a[N], *p=a;

则有:

地点三等价:

存在等价表达式:

p+i <=> a+i <=> &a[i]  代表的凡第i独元素的地方

**元素四等价格:
**

存等价表达式:

  1.   *(p+i) <=> *(a+i) <=> a[i]   代表的是第i只元素的价值

  2.  另外,还有 p[i] <=> a[i] 。 p[i]
    的用法不多见,但不管外不当,代表的也罢是第i独要素的价。原因是p和a完全等价格。

整理出来的等价式如下:

a) *(p+i) <=> *(a+i) <=> a[i] <=> p[i]
b) p++ <=> ++p <=>  p+=1 <=>  p=p+1
c) p– <=>  –p  <=>  p-=1  <=>  p=p-1
d) *p++  <=>   *(p++)
   说明:* 与 ++
的运算优先级一样,所以照从右到左的组成原则,先实行++,后实行*
   ++在p的后面,为推行后再度加。即先拿p的值取出,指针再加1.
e) *++p  <=>  *(++p)
   
++在p的眼前,为优先加再实践。即先把指针加1,
再将运动后底p所指向的值取出,
f) (*p)++ <=>   ++(*p)  <=>   ++*p
    将p的始末自增
g) (*p)–  <=>  –(*p)  <=>   –*p
    将p的内容自减