指针:
格式:变量类型 *变量名;
定义一个指针变量p int *p;
指针变量只能存储地址
p = &a
指针的作用:
跟狗根据一个地址值,访问对应的存储空间
指针变量p前面的int:指针变量p只能指向int类型的数据
注意:
不建议下述写法
1、
int *p;
double d = 10.0;
p=&d;
int *p只能指向int类型的数据
2、
int *p;
p = 200;
指针变量只能存储地址
3、int *p;
printf("%d",*p)
指针未经过初始化,不要拿来间接访问其他存储空间
4、
int *p = &a;正确
int *p; *p = &a; 错误 int *p; p=&a;正确
原因:定义指针时 int *p = &a;可以理解为 (int *)p = a;
只是为了说明p是一个整型的指针类型变量
注意:
int *p;定义变量时的*仅仅是一个象征,没有其他特殊含义
*p=a;这个时候*的作用:访问指针变量p指向的存储空间
指向指针的指针:
格式:
int a =10;
int *p = &a;
int **pp = &p;((int *)*p = &p)指向指针的指针
指向任何类型的指针都占用8个字节,为什么指针还要分类型呢?
原因:
输出值:
int i =2; int i =2;
char c =1; char c =1;
char *p; int *p;
p=&c; p=&c;
printf("d%",*p); printf("d%",*p)
输出结果是: 1 输出结果为513
取值:
int i = 2;
char c = 1;
int *p;
p=&c;
*p=10;
printf("%d",*p); 取出数据错误
原因:由于 *p为int 类型 默认为四个字节
*p = 10; 将10的值赋给p指向的地址
而 p指向的地址为char值得问题
原因:内存中的存储,i(4个字节),c(1个字节) 二者相邻
int *p;p=&c 表示 指针p指向变量c的地址
由于 i为整型,所以默认要从首地址c开始向后取四个字节
因此取到了非变量c的值。因此 指针类型的定义时很有必要的否则可能造成取出的数据不是想要的
指针与数组:
int ages[5]={1,2,3,4,5};
int *p;
p=ages[0];//或者p=ages 数组名表示数组的起始地址,表示数组的第一个元素的地址
printf("%d",*p);
for(int i= 0 ;i< 5;i++)
{
printf("ages[%d] = %d",i,*(p+i));
}
数组元素的访问方式:
1、数组名[下标] ages[0]
2、利用指针变量名[下标] p[1]
3、*(p+i)
指针变量的+1,究竟加多少,取决于指针的类型
若为 int* +4 char* +1 double * +8
地址传递,不一定要从首地址开始
change(&ages[2]);
传递的是ages[2]的地址
指针与字符串
char *name2 = "it";
指针变量name2指向了字符串的首字符
printf("%s\n",name2) 输出结果为 it
"%s" 从name2开始输出字符串 直到遇到\0为止
字符串定义的两种方式:
1、利用数组
char name[] = "it"
可以通过 name[0] = T;进行更改
适用场合:字符串的内容需要经常修改
2、利用指针
char *name = "it";
*name = 'T' 错误 不可进行更改
原因:字符串其实是一个常量字符串,里面的字符不能修改
根本原因:在内存中的存放地址不同,第一种存放于变量区,第二种存放于常量区
使用场合:字符串的内容不需要修改,而且这个字符串经常使用
内存:
1、常量区
存放常量字符串
2、堆
对象
3、栈
存放局部变量
字符串数组存放方法
指针数组:
char *names[5] = {"jack","rose","lee"};
二维字符数组
char name1[2][10] = {"jack","rose","lee"};
scanf("%s",name);
name为数组的首地址,‘%s’的存入时表示从首地址开始直到遇见‘\0’结束
返回指针的函数:
char *test()
{
return "rose";//返回“rose”的首地址
}
int main()
{
char *name = test();
printf("%s",name);
}
指向函数的指针:
void test()
{
printf("调用了test函数");
}
int main()
{
int ages[5];
//(*p)是固定写法,代表指针变量p将来肯定是指向函数
//左边的void:指针变量p指向的函数没有返回值
//右边的():指针变量p 指向的函数没有形参
void (*p)();
p = test;//指针变量p指向test函数
p();//也可以调用test函数
(*p)();//利用指针变量间接调用test函数
test();//直接调用函数;
return 0;
}
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);//调用函数法1
int c = (*p)(10,11);//调用函数方法2
int c =sum(10,11);//调用函数方法3
}
要求:
掌握:
1、看懂语法
2、定义指向函数的指针
double (*p)(double char*,int); p = sum;
或者
double(*p)(double,char*,int) = sum;
3、如何间接调用函数
1、p();
2、(*p)();
格式:变量类型 *变量名;
定义一个指针变量p int *p;
指针变量只能存储地址
p = &a
指针的作用:
跟狗根据一个地址值,访问对应的存储空间
指针变量p前面的int:指针变量p只能指向int类型的数据
注意:
不建议下述写法
1、
int *p;
double d = 10.0;
p=&d;
int *p只能指向int类型的数据
2、
int *p;
p = 200;
指针变量只能存储地址
3、int *p;
printf("%d",*p)
指针未经过初始化,不要拿来间接访问其他存储空间
4、
int *p = &a;正确
int *p; *p = &a; 错误 int *p; p=&a;正确
原因:定义指针时 int *p = &a;可以理解为 (int *)p = a;
只是为了说明p是一个整型的指针类型变量
注意:
int *p;定义变量时的*仅仅是一个象征,没有其他特殊含义
*p=a;这个时候*的作用:访问指针变量p指向的存储空间
指向指针的指针:
格式:
int a =10;
int *p = &a;
int **pp = &p;((int *)*p = &p)指向指针的指针
指向任何类型的指针都占用8个字节,为什么指针还要分类型呢?
原因:
输出值:
int i =2; int i =2;
char c =1; char c =1;
char *p; int *p;
p=&c; p=&c;
printf("d%",*p); printf("d%",*p)
输出结果是: 1 输出结果为513
取值:
int i = 2;
char c = 1;
int *p;
p=&c;
*p=10;
printf("%d",*p); 取出数据错误
原因:由于 *p为int 类型 默认为四个字节
*p = 10; 将10的值赋给p指向的地址
而 p指向的地址为char值得问题
原因:内存中的存储,i(4个字节),c(1个字节) 二者相邻
int *p;p=&c 表示 指针p指向变量c的地址
由于 i为整型,所以默认要从首地址c开始向后取四个字节
因此取到了非变量c的值。因此 指针类型的定义时很有必要的否则可能造成取出的数据不是想要的
指针与数组:
int ages[5]={1,2,3,4,5};
int *p;
p=ages[0];//或者p=ages 数组名表示数组的起始地址,表示数组的第一个元素的地址
printf("%d",*p);
for(int i= 0 ;i< 5;i++)
{
printf("ages[%d] = %d",i,*(p+i));
}
数组元素的访问方式:
1、数组名[下标] ages[0]
2、利用指针变量名[下标] p[1]
3、*(p+i)
指针变量的+1,究竟加多少,取决于指针的类型
若为 int* +4 char* +1 double * +8
地址传递,不一定要从首地址开始
change(&ages[2]);
传递的是ages[2]的地址
指针与字符串
char *name2 = "it";
指针变量name2指向了字符串的首字符
printf("%s\n",name2) 输出结果为 it
"%s" 从name2开始输出字符串 直到遇到\0为止
字符串定义的两种方式:
1、利用数组
char name[] = "it"
可以通过 name[0] = T;进行更改
适用场合:字符串的内容需要经常修改
2、利用指针
char *name = "it";
*name = 'T' 错误 不可进行更改
原因:字符串其实是一个常量字符串,里面的字符不能修改
根本原因:在内存中的存放地址不同,第一种存放于变量区,第二种存放于常量区
使用场合:字符串的内容不需要修改,而且这个字符串经常使用
内存:
1、常量区
存放常量字符串
2、堆
对象
3、栈
存放局部变量
字符串数组存放方法
指针数组:
char *names[5] = {"jack","rose","lee"};
二维字符数组
char name1[2][10] = {"jack","rose","lee"};
字符串输入:
char name[20];scanf("%s",name);
name为数组的首地址,‘%s’的存入时表示从首地址开始直到遇见‘\0’结束
返回指针的函数:
char *test()
{
return "rose";//返回“rose”的首地址
}
int main()
{
char *name = test();
printf("%s",name);
}
指向函数的指针:
void test()
{
printf("调用了test函数");
}
int main()
{
int ages[5];
//(*p)是固定写法,代表指针变量p将来肯定是指向函数
//左边的void:指针变量p指向的函数没有返回值
//右边的():指针变量p 指向的函数没有形参
void (*p)();
p = test;//指针变量p指向test函数
p();//也可以调用test函数
(*p)();//利用指针变量间接调用test函数
test();//直接调用函数;
return 0;
}
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);//调用函数法1
int c = (*p)(10,11);//调用函数方法2
int c =sum(10,11);//调用函数方法3
}
要求:
掌握:
1、看懂语法
2、定义指向函数的指针
double (*p)(double char*,int); p = sum;
或者
double(*p)(double,char*,int) = sum;
3、如何间接调用函数
1、p();
2、(*p)();