一.指针的基本概念
* number = 10;//*是什么意思呢?
// 1.通过number这个地址,找到他指向的空间
// 2.到这个空间里,取出里面存储的值
普通变量基本格式:
变量类型 变量名;
指针变量基本格式:
变量类型 * 指针变量名
指针里面存的是别的变量的地址 %p来打印 值是0x开头的,16进制数字
指针变量在内存中占8个字节
int * pointer;//定义一个指针, *只是一个标识符,不属于变量名字,没有任何意义
> 定义一个指针变量的时候, *只是一个标识符,不属于变量名字,也不属于变量类型名字,没有任何意义
> *放在一个指针变量的前面的时候,是什么意思呢?
1.通过指针里面存的这个地址,找到他指向的空间
2.到这个空间里,取出里面存储的值
int num2 = 16127;
int * p = &num2;
*p = 66;
printf("%d",num2);
// num2 = 20;//直接改变num2的值
*.指针的注意点
1.指针变量保存变量的地址的类型,必须和指针变量的类型一样
int * p;// p只能保存int类型变量的地址
错误写法:
double d = 10.1;
p = &d;//取出了(double类型变量)d的地址,赋值给了(只能保存int类型变量的地址)p
2.指针变量只能存储地址,不能直接把常量赋值给他
int *p1;
int num = 10;
p1 = #//正确的
p1 = 250;//理论上没错,但实际开发不这样写
3.指针变量没有初始化,没有保存任何变量的地址,没有指向任何的变量,不能间接访问
int *p2;
printf("p2 = %d\n",*p2);//p2是个野指针
4.指针变量也是变量,所以也是可以定义的同时初始化
// int *p3;
// int num2 = 10;
// p3 = &num2;
int *p3 = #
5.多个指针变量同时指向同一个变量(多个指针变量同时保存一个变量的地址)
int b = 10;
int *p5 = &b;
int *p6;
p6 = &b;
6.指针的指向可以改变(一个指针可以改变里面保存的地址,只要是类型匹配)
int c = 20;
p6 = &c;
7.不使用的指针,就把指针清空 置成 NULL
int e = 10;
int *p7 = &e;
printf("%d\n",*p7);
// 清空指针
p7 = NULL;
// p7 = 0;
二.指向指针的指针
int i = 10;//普通变量类型
int * ip = 202;//指针也是数据类型
int ** ipp;//ipp 这个指针变量,就是指向指针的指针
ipp = &ip;
三.指针与数组
int ages[5] = {1, 3, 12, 65, 23};
访问数组元素有3种方式 (其实这3种方式,在编译的时候,都是一样的)
1.数组名[角标]
2.指针变量名[角标]
3.*(指针变量名 + 角标)
1.1 printf("ages[2] = %d\n",ages[2]);
2.1 printf("p[2] = %d\n",p[2]);
3.1 printf("ages[%d] = %d\n",i,*(p + i));
重点:指针变量+几,是加上指针变量类型所占用的字节数
数组名字作为函数的参数传递的时候,会把数组名自动转换成地址
所以通过指针来接收,指针指向的是第0个元素
void printArray(int *array)//遍历一个数组,还是需要从外界传过来元素个数
{
// int length = sizeof(array)/sizeof(int);
// printf("length = %d\n",length);
// for (int i = 0;i < length; i++) {
// printf("array[2] = %d\n",*(array + 2));
// }
*(array + 3) = 0;
}
int main(int argc, const char * argv[])
{
int ages[5] = {12, 34, 23, 81, 15};
// int length = sizeof(ages)/sizeof(int);
// printf("length = %d\n",length);
printf("ages[3] = %d\n",ages[3]);
printArray(ages);
printf("ages[3] = %d\n",ages[3]);
return 0;
}
char * 保存的是不可变字符串 char *是一个常量
char name[] char数组里面保存的是可以变的字符串
常量区存放的特点:一个的常量地址是一样的
char *name2 = "lty";
char *name3 = "lty";
char *name4 = "lty";
//name2、name3、name4三个指针都是指向同一块地址
char name[] = "lty";
char name5[] = "lty";
五.指针作为函数的返回值
//注意点:当用数组保存字符串的时候,是放在栈里的,当函数执行完毕就释放了
char * test2()
{
char *name = "lty";
// return "lty";
//char name[10] = "lty";
return name; //错误写法
}
int main()
{
// int result = test();
// printf("%d\n",result);
char *result = test2();
printf("%s\n",result);
return 0;
}