首先是关于指针定义
1、指针变量的定义
数据类型* 变量名;
1、在定义指定变量时,*起到标志性的作用, 除此情况以外,所有指针变量前面加*,表示指针指向的内存
2、*指针变量: 可以作左值也可以作右值
3、*指针变量: 本质就是解引用,访问从保存的地址开始,n个连续的内存
4、指针变量要与保存的地址类型匹配, 否则保存地址一点问题都没有,但是通过指针访问数据存在问题
5、不要出现野指针, 如果指针不知道指向哪里,可以指向NULL
编译时可以使用gdb调试
常用指令:
(1)编译 : gcc xx.c -o xx -g
(2)执行: gdb ./xx
(3)gdb内部指令:
r : 运行
b 行号/函数名: 打断点
n : 单步调试
p 变量名: 打印变量数据
q : 退出gdb
l :查看代码
整形和字符型:
int main01()
{
int a = 10;
int* p = &a;
//int b = *p;
*p = 200;
printf("a: %d, *p= %d\n", a, *p);//输出a,*p指向a
printf("&a: %p, p=%p\n", &a, p);//输出a地址,p中存放的时a的地址
printf("&p: %p\n", &p);//输出指针p的地址
return 0;
}
int main02()
{
char a = '1';
char* p;
p = &a;
printf("a: %c, *p= %c\n", a, *p);
printf("&a:%p, p=%p\n", &a, p);
printf("&p: %p\n", &p);
return 0;
}
int main03()
{
printf("sizeof(int*) = %ld\n", sizeof(int*));//64位机中长度都为8
printf("sizeof(double*) = %ld\n", sizeof(double*));
printf("sizeof(char*) = %ld\n", sizeof(char*));
printf("sizeof(long*) = %ld\n", sizeof(long*));
return 0;
}
数组:一维数组
(1)&a[0] &a[1] .... &a[i] ------》每个元素的起始地址
(2)a a+1 ..... a+i ------>每个元素的起始地址
(3) &a ---》表示数组的起始地址
&a+1 --->偏移一个数组的大小
(4)数组名的含义: 表示数组首元素的起始地址,并且是一个常量,不能被改变的
#include <stdio.h>
指针操作一维数组
//1、指针自增的方式访问数组每一个元素, 指针的指向发生改变
int main01()
{
int a[5] =