————————Java培训、Android培训、iOS培训、.Net培训、期待与您交流!————————
一、 指针的基本概念
指针是一种数据类型,用来存储指针变量。指针里存储的是地址,指针的强大之处就在于它可以直接通过访问地址来操作和修改变量。
格式:
变量类型 *变量名
这里注意两点。
一变量类型,什么变量类型的指针就只能存储什么变量的地址,是一一对应的。
二 * 可以说是指针的标志。变量类型 * 一起就相当于int a 中的int
指针默认存储是8个字节
int a = 10;
p = &a; // 指针变量p指向了变量a
*p = 10; // 通过指针来修改变量值 取p中地址的变量来赋值
a = 20; // 通过变量本身来修改变量值
通过指针可以实现直接在函数中修改,主函数中的局部变量值
void change(int *n)
{
*n = 10;
}
int a = 90;
change(&a);
printf("a=%d\n", a);
结果为:10
传入函数的时变量地址可以在函数里通过这个指针直接修改变量的值
指针的一些使用注意
<span style="font-size:12px;"> /* 不建议的写法, int *p只能指向int类型的数据
int *p;
double d = 10.0;
p = &d;*/
/* 指针变量只能存储地址
int *p;
p = 200;
*/
/* 指针变量未经过初始化,不要拿来间接访问其他存储空间
int *p;
printf("%d\n", *p);
*/
int a = 10;
/*
int a;
a = 10;
*/
/*
int *p;
p = &a;
*/
// 定义变量时的*仅仅是一个象征,没有其他特殊含义
int *p = &a;
// 不正确的写法
// *p = &a;
p = &a;
// 这个时候的*的作用:访问指向变量p指向的存储空间
*p = 20;
</span>
指向指针的指针
通指针存储的是变量地址,指向的就是变量,如果拿一个指针存储指针地址,就是 指向 指针的指针。
格式:就在在指针基础上加个*
变量类型 **变量名
int a = 10;
int *p = &a;
int **pp = &p;
图解:
// 清空指针
p = NULL;
// 清空指针后,不能再间接访问其他存储空间
// *p = 100.7;
不同类型数据,输出时的占位符
%d int
%f float\double
%ld long
%lld long long
%c char
%s 字符串
%zd unsigned long
二、 指针和数组
1.数组元素的访问方式
int ages[5];
int *p;
p = ages; // 相当于把数组地方赋值给指针,指针变量p指向了数组的首元素。
1> 数组名[下标] ages[i]
2> 指针变量名[下标] p[i]
3> *(p + i) // 其中 p+i 就相当于 取数组i角标位的地址 &ages[i]
2.指针变量+1,地址值究竟加多少,取决于指针的类型
int * 4
char * 1
double * 8
三、 指针和字符串
定义字符串的2种方式
1> 利用数组
char name[] = "itcast";
* 特点:字符串里面的字符是可以修改的
* 使用场合:字符串的内容需要经常修改
* 当确定大小以后可以用scanf函数向其中输入字符串
2> 利用指针
char *name = "itcast";
* 特点:字符串其实是一个常量字符串,里面的字符是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用
用指针存储字符串数组
// 指针数组(字符串数组)
char *names[5] = {"jack", "rose", "jake"};
四、 指针总结
通俗来理解就是存储地址的变量,指针的优势就是直接通过地址来访问变量
1、指针变量的定义格式
1> 格式:变量类型 *指针变量名;
2> 举例:int *p; char *p2;
3> 注意:定义变量时的*仅仅是指针变量的象征
2、利用指针变量简单修改其他变量的值
1>指向某个变量
int a;
int *p;
p = &a;
或者
int *p = &a;
2>修改所指向变量的值
*p = 10;
3>在函数内部修改外面变量的值
int a = 10;
change(&a);
void change(int *n)
{
*n = 20;
}
3、指针与数组
1>将数组当做函数参数传入时,会自动转为指针
2>数组名其实就是一个指针,它代表的是数组的地址
4、指针与字符串
1>定义字符串的2种方式
利用数组
char name[] ="itcast";
* 特点:字符串里面的字符是可以修改的
* 使用场合:字符串的内容需要经常修改
一般与scanf函数连用,接收传入的字符串
如:
char name[10];
scanf("%s", name); // 此时name代表地址
数组接收字符串,同等大小情况下,可以相互赋值
利用指针
char *name ="itcast";
* 特点:字符串其实是一个常量字符串,里面的字符是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用
不能与scanf函数连用,传入字符串,原因:实际上它只是一个可以存放地址的指针,未定义它的大小,
2>定义字符串数组
利用二维字符数组
char names[2][10] = {"jack","rose"};
利用指针数组
char *names[2] = {"jack","rose"};
五、返回指针的函数
也就是返回值类型是指针类型
int main()
{
char *name = test();
printf("name=%s\n", name);
return 0;
}
char *test()
{
return "rose";
}
六、 指向函数的指针
定义一个指向函数的指针,包括类型和参数两个,因为有参函数会向其中传递参数。
1、定义一个指向没有 参数的函数 的函数指针
void test()
{
printf("调用了test函数\n");
}
函数指针
先定义指针类型
void (*p)();
// (*p)是固定写法,代表指针变量p将来肯定是指向函数,相当于变量名
// 左边的void:指针变量p指向的函数没有返回值
// 右边的():指针变量p指向的函数没有形参
在将函数地址赋值给函数指针
// 指针变量p指向了test函数
p = test;
利用指针变量间接调用函数
(*p)();
2、定义一个 带有参数的指针变量
定义指针指向sum函数
int sum(int a, int b)
{
return a + b;
}
int (*p)(int, int); // 定义指向sum的指针
p = sum; // 函数地址赋值给指针
int c = (*p)(10, 11); // 用指针调用函数
int c = p(10, 11); // 用指针调用函数(简写)
七、基本数据类型总结
一、基本数据类型
1.int
1> long int、long:8个字节 %ld
2> short int、short:2个字节 %d %i
3> unsigned int、unsigned:4个字节 %zd
4> signed int、signed、int:4个字节 %d %i
2.float\double
1> float :4个字节 %f
2> double:8个字节 %f
3.char
1> 1个字节 %c %d
2> char类型保存在内存中的是它的ASCII值
'A' --> 65
二、构造类型
1.数组
1> 只能由同一种类型的数据组成
2> 定义:数据类型 数组名[元素个数];
2.结构体
1> 可以由不同类型的数据组成
2> 先定义类型,再利用类型定义变量
三、指针类型
1.变量的定义
int *p;
2.间接操作变量的值
int a = 10;
p = &a;
*p = 20;
四、枚举类型
使用场合:当一个变量只允许有几个固定取值时
————————Java培训、Android培训、iOS培训、.Net培训、期待与您交流!————————