------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
二、指针使用注意
1> int *p 只能指向int类型的数据
2> 指针变量只能存储地址
不建议写法:
定义变量时的*仅仅是一个象征,没有其他特殊含义
这个时候的*的作用:访问指向变量p指向的存储空间
指针的应用: 在一个函数里面求出两个数的和差。
三、指向指针的指针
1.数组元素的访问方式
1> 数组名[下标] ages[i]
2> 指针变量名[下标] p[i]
3> *(p + i)
2.指针变量的+1究竟加多少,取决于指针的类型
int * 4
char * 1
double * 8
五、指针与字符串
1.定义字符串的2种方式
1.定义字符串的2种方式
1> 利用数组
char name[] = "itcast";
* 特点:字符串里面的字符是可以修改
* 使用场合:字符串的内容需要经常修改
2> 利用指针
char *name = "itcast"
* 特点:字符串其实是一个常量字符串,里面的字符是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用
六、返回指针的函数
一、定义
指针是一个用来指示一个内存地址的计算机语言的变量。
指针,是一个无符号整数(unsigned int),它是一个以当前系统寻址范围为取值范围的整数。
应用场景:
基本数据类型传入函数参数不能改变其值,用指针就可以
变量类型 变量名;
格式:变量类型 *变量名;
指针变量只能存储地址
指针就一个作用:能够根据一个地址值,找到对应的存储空间
指针变量p前面的int:指针变量p只能指向int类型的数据
利用指针改变函数内部变量示例:
#include <stdio.h>
void change(int *n);
int main()
{
int a = 90;
change(&a);
printf("%d\n", a); // a = 10;
return 0;
}
void change(int *n)
{
*n = 10;
}
二、指针使用注意
1> int *p 只能指向int类型的数据
//不建议写法:
int *p;
double d = 10.0;
p = &d;
2> 指针变量只能存储地址
//不建议写法:
int *p;
p= 200;
3> 指针变量未经过初始化,不要拿来间接访问其他存储空间
不建议写法:
int *p;
printf("%d\n", *p);
定义变量时的*仅仅是一个象征,没有其他特殊含义
int *p = &a;
// 不正确的写法
// *p = &a;
p = &a;
这个时候的*的作用:访问指向变量p指向的存储空间
*p = 20;
指针的应用: 在一个函数里面求出两个数的和差。
#include <stdio.h>
int sumAndMinus(int n1, int n2, int *n3);
int main()
{
int a = 10;
int b = 7;
// 存储和
int he;
// 存储差
int cha;
he = sumAndMinus(a, b, &cha);
printf("和是%d, 差是%d\n", he, cha);
return 0;
}
int sumAndMinus(int n1, int n2, int *n3)
{
*n3 = n1 - n2;
return n1 + n2;
}
三、指向指针的指针
int main()
{
int a = 10;
int *p = &a;
int **pp = &p;
**pp = 20;
printf("%d\n", a);
return 0;
}
四、指针与数组
int ages[5];
int *p = ages;
p = ages;
1.数组元素的访问方式
1> 数组名[下标] ages[i]
2> 指针变量名[下标] p[i]
3> *(p + i)
2.指针变量的+1究竟加多少,取决于指针的类型
int * 4
char * 1
double * 8
void test()
{
double d = 10.8;
double *dp;
dp = &d;
printf("dp = %p\n", dp);
printf("dp + 1 = %p\n", dp + 1);
int ages[5] = {10, 9, 8, 67, 56};
int *p;
// 指针变量p指向了数组的首元素
p = &ages[0];
// 数组名就是数组的地址,也是数组首元素的地址
// p = ages;
/*
p ----> &ages[0]
p + 1 ----> &ages[1]
P + i ----> &ages[i]
*/
//printf("%d\n", *(p+2));
printf("%d\n", p[2]);
for (int i = 0; i<5; i++) {
printf("ages[%d] = %d\n", i, *(p+i));
}
printf("%p\n", p);
printf("%p\n", p + 1);
printf("%p\n", p + 2);
}
五、指针与字符串
1.定义字符串的2种方式
1.定义字符串的2种方式
1> 利用数组
char name[] = "itcast";
* 特点:字符串里面的字符是可以修改
* 使用场合:字符串的内容需要经常修改
2> 利用指针
char *name = "itcast"
* 特点:字符串其实是一个常量字符串,里面的字符是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用
int main()
{
char name[20];
printf("请输入姓名:\n");
scanf("%s", name);
return 0;
}
// 定义字符串数组
void test2()
{
char *name = "jack";
// 指针数组(字符串数组)
char *names[5] = {"jack", "rose", "jim"};
// 二维字符数组(字符串数组)
char names2[2][10] = {"jack", "rose"};
}
// 定义字符串
void test()
{
// 字符串变量
char name[] = "it";
name[0] = 'T';
// 字符串常量
char *name2 = "it";
char *name3 = "it";
printf("%p\n%p\n", name2, name3);
}
六、返回指针的函数
char *test();
int main()
{
char *name = test();
printf("name=%s\n", name);
return 0;
}
char *test()
{
return "rose";
}
七、指向函数的指针
定义指向函数的指针
double (*p)(double, char *, int);
p = haha;
或者
double (*p)(double, char *, int) = haha;
如何间接调用函数
1>p(10.7, "jack", 10)
2>(*p)();
void test()
{
printf("调用了test函数\n");
}
int sum(int a, int b)
{
return a + b;
}
int main()
{
// 定义指针变量指向sum函数
// 左边的int: 指针变量p指向的函数返回int类型的数据
// 右边的(int, int):指针变量p指向的函数有2个int类型的形参
int (*p)(int, int);
p = sum;
// int c = p(10, 11);
//int c = (*p)(10, 11);
int c = sum(10, 9);
printf("c is %d\n", c);
return 0;
}
void test1()
{
// (*p)是固定写法,代表指针变量p将来肯定是指向函数
// 左边的void: 指针变量p指向的函数没有返回值
// 右边的():指针变量p指向的函数没有形参
void (*p)();
// 指针变量p指向了test函数
p = test;
p();
// (*p)(); // 利用指针变量间接调用函数
// test(); // 直接调用函数
}