指针和其他知识点的联系

一、指针和数组:
①数组指针:首先是个指针 ===》 这个指针保存的是什么地址? ===》保存的是数组的地址;

  小结:
1、一维数组名代表数组首元素的地址;
//char str[5] = "hello";
str + 0 == &str[0];
str + 1 == &str[1];
str + 2 == &str[2];

2、对一维数组的数组名进行取地址操作,代表的是数组的地址;
&str + 1 == str[4]后面的那个地址! //跳过了整个数组!


char *p;
p = str;   //或者&str[0];
// p = &str; //错误,虽然数值和str以及&str[0]相等,但是含义不一样!

for(i = 0; i < 5; i++)
{
printf("*(p + %d) = %c\n",i,*(p + i));//e
}
小结:
如果p保存的是字符数组中的首元素地址;
p ===》指向a[0] ===》说明保存的是a[0]的地址;
p + 1 ===》指向a[1] ===》说明保存的是a[1]的地址;
p + 2 ===》指向a[2] ===》说明保存的是a[2]的地址;
p + 3 ===》指向a[3] ===》说明保存的是a[3]的地址;
p + 4 ===》指向a[4] ===》说明保存的是a[4]的地址;

*p 等于 a[0];
*(p + 1)等于a[1];
*(p + 2)等于a[2];
....

===》引用数组元素有哪些方法:
1、下标法;a[i];
2、指针变量:  *(p + i) = a[i];
3、数组名:   *(a + i) = a[i];

//以下是2018.5.27
一维数组的数组名代表的是数组首元素的地址;
对一维数组名取地址,代表的是数组的地址;

二维数组的数组名代表的是第一个一维数组的地址;
对二维数组名取地址,代表的是二维数组的地址!

int a[3][2];
a[0]:是二维数组中第一个一维数组的数组名;
a[1]:是二维数组中第二个一维数组的数组名;
a[2]:是二维数组中第三个一维数组的数组名;

a : 第一个一维数组的地址;
a + 1: 第二个一维数组的地址;
a + 2: 第三个一维数组的地址;

②指针数组:首先是个数组,每个数组元素都是指针,也就是地址!

char *str[] = {"hello","world","linux"};

指针和函数的联系:
①指针函数:是一个函数,返回值是一个指针变量! //在函数的返回值方面,指针和函数的联系;

int *fun()
{

}
②函数指针:是一个指针,这个指针指向一个函数; //在函数名方面,指针和函数的联系;
对于函数的第二种调用方法;
首先你要知道的是:函数的地址,就是函数名!

1、定义一个函数指针;
怎么定义:
直接把函数的声明赋值过来,然后将函数名换成(*p);

2、让函数指针指向某个函数,也就是给函数指针绑定函数;
p = 函数名; //

3、通过函数指针来调用函数;
将通过函数名调用的方法中,用(*p)来代替函数名;





③指针作为函数的参数; //函数的参数方面,指针和函数的联系;
int swap(int a,int b);
{
printf("a = %d\tb = %d\n",a,b);
int temp = 0;

temp = a;
a = b;
b = temp;

printf("a = %d\tb = %d\n",a,b);
}

int main()
{
int x = 10;
int y = 20;

swap(x,y);

printf("x = %d\n",x);
printf("y = %d\n",y);

return 0;
}

//数组名作为函数的参数;
// void fun(char *p) //既然实参是地址,那么形参来接收的应该定义一个变量能够
//保存传过来的地址! ===》指针变量!
void fun(char a[]) //数组名作为函数的形参,退化为指针处理!
{ //为什么需要[],如果没有[],就变成了char a ==》就是一个字符
//所以这里的[]表明是一个数组;

}

int main()
{
char str[] = "hello";

fun(str); //将数组名作为函数的实参,传递给参数
//因为数组名是数组首元素的地址,所以就相当于传递了地址;

return 0;
}

指针和字符串的联系:
char str[] = "hello";//这里面的hello是字符数组里面的;
char *p = "hello"; //这里的"hello"是字符串常量;
//字符串常量保存在.text段;不能够改变;
//用p来保存字符串常量的首地址!
*(p + 2) = 'q'; //试图修改常量区的内容!会报错!

你可能感兴趣的:(指针和其他知识点的联系)