C基础学习过程02
文章目录
- 一、指针的概念与定义
- 1.1 指针的概念
- 1.2 指针的定义
- 1.3 指针的初始化
- 1.4 指针的调用
- 1.5 指针的赋值
- 练习-倒序打印字符
- 1.6 万能指针
一、指针的概念与定义
1.1 指针的概念
- 内存上一片空间的地址
- 指针就是地址,地址就是指针
- 什么是地址?
内存被划分为一个个字节的存储单元,每个字节都有一个唯一的编号,这个编号就是地址,用于标识内存中的具体位置。 - 指针:轻量级的作用,方便我们操作地址
1.2 指针的定义
- 一般形式:
存储类型 数据类型 *指针变量名; - 例如:
int *p; - 说明:
存储类型是指针的存储类型,数据类型是指针指向对象的数据类型 - 指针的大小:
指针的大小和数据类型没有关系,和操作系统位数有关,64位操作系统下指针大小为8byte,32位操作系统下指针大小为4byte。
#include <stdio.h>int main(int argc, char *argv[])
{printf("%ld\n", sizeof(char *));printf("%ld\n", sizeof(int *));printf("%ld\n", sizeof(double *));return 0;
}
* :指针的标志,在定义和初始化时 * 表示后面这个变量为指针变量
指针变量名:标识符,遵守变量名命名规则,一般指针和指针变量名统称为指针
1.3 指针的初始化
一般形式:
存储类型 数据类型 *指针变量名 =
例如:int a = 1
int *p = a
#include <stdio.h>int main(int argc, char *argv[])
{int a = 1; // 初始化aint *p = &a; // 初始化指针printf("a=%p\n", &a); // a的首地址printf("p=%p\n", p); // 存储a的首地址printf("&p=%p\n", &p); // 指针p本身的地址return 0;
}
1.4 指针的调用
*:取内容符,用于获取指针所指向地址上的内容。*和&互为逆运算。- 一般形式:
*指针变量名
地址具有唯一性
#include <stdio.h>int main(int argc, char *argv[])
{int a = 4;int *p = &a;printf("a=%d\n", a);printf("*(&a)=%d\n", *(&a));printf("*p=%d\n", *p);return 0;
}
// a=4
// *(&a)=4
// *p=4
1.5 指针的赋值
- 已知变量的地址
int a = 4;
int *p = &a;
-
把NULL赋值给指针,空地址(相当于指针的初始化为0x0000 0000)
- 防止野指针出现(没有指向的指针)
-
把数组的首地址赋值给指针
#include <stdio.h>int main(int argc, char *argv[])
{int a[5] = {12, 34, 56, 78, 90};// 数组名a代表数组的首地址,即&a[0],将其赋值给指针p,使p指向数组的第一个元素int *p = a; printf("a[3]=%d\n", a[3]);// 通过指针p的偏移来访问数组元素,p+3指向数组的第4个元素(下标从0开始),* (p+3)获取该元素的值printf("*(p+3)=%d\n", *(p+3));printf("p[3]=%d\n",p[3]);printf("*(a+3)=%d\n"(a+3));return 0;
}
a. * 和 [ ] 可以互换
数组名和指针变量名可以互换,但是数组名是一个常量,指针变量名是一个变量
#include <stdio.h>int main(int argc, char *argv[])
{int a[5] = {12, 34, 56, 78, 90};int *p = a; //相当于int *p = &a[0];数组名代表数组的首地址printf("*(p+1)=%d\n", *(p+1)); // 34 因为p+1让下标0->1,但是p本身没有变化 所以34printf("*p++=%d\n", *p++); // 12printf("*p=%d\n", *p); // 34 因为p++让下标0->1 所以34printf("*a++=%d\n", *a++);return 0;
}
- 把同级指针赋值给指针
#include <stdio.h>int main(int argc, char *argv[])
{int a = 4;int *p = &a;int *q = p;printf("a=%d\n", a);printf("*p=%d\n", *p);printf("*q=%d\n", *q);return 0;
}
练习-倒序打印字符
#include <stdio.h>
#include <string.h>int main(int argc, char *argv[])
{char a[128] = {0};gets(a); // 输入字符串char *p = a;int i; // 交换的次数char temp; // 中间变量int len = strlen(a);for (i = 0; i < len / 2; i++){temp = *(p + i);*(p + i) = *(p + len - 1 - i);*(p + len - 1 - i) = temp;}puts(a);return 0;
}
1.6 万能指针
可以指向任意数据类型的指针
void 修饰的指针
void *p;
但是在调用取值的时候需要强转成你指向的数据类型
#include <stdio.h>int main(int argc, char *argv[])
{int a = 10;void *p = &a;printf("%d\n", *((int *)p));return 0;
}
