1. 存储及访问:
- 内存单元:一个字节,每个内存单元都有编号,也就是内存单元的地址。
- 访问方式:
直接访问:直接通过名字访问;
间接访问:不知道变量名,通过地址名访问,找到变量所在的地址。
指针变量存储的是地址 定义指针变量:
(1) 定义:类型修饰符 (int *) 变量名 初值 int *p = NULL;
(指针变量所占的字节数和OS有关,32位-4字节 64位-8字节)(2) 打印指针的类型转换符:%p
取值:* 取址:&
int *是类型修饰符:int型的指针变量
(3) 修改,赋值
int a = 5, b = 8;
int *pa = &a;
*pa = 6; // 修改了a里面的值 赋值工作
b = *pa; // 修改了b的值,对b进行赋值 取值工作
int c = 5, d =78; // 连续定义:
int *pc = &c, *pd = &d;
2. 指针与数组,字符串
int a[5] = {1, 2, 3, 4, 5};
int *p = NULL;
p = a;
p = &a[0]; // 数组名就是数组的首地址 p = &a[0]这样也可以
/*
p = &a[0];
p + 1 = &a[1];
p + 2 = &a[2];
...
*/
// 指针的偏移量和指向的数据有关
printf("%p\n", p);
printf("%p\n", p + 1);
printf("%p\n", p + 2);
printf("%p\n", p + 3);
printf("%p\n", p + 4);
for (int i = 0; i < 5; i ++)
printf("%d ", *p++); // p[i]------->1, 2, 3, 4, 5
数组遍历:数组名[下标] a[i] 指针变量:*[p + i] = a[i] 指针变量:p[i] = a[i]
指针和数组的区别:
指针和数组名都可以通过下标的方法和指针法(p+1)来访问数组元素- 指针可以修改指向
数组名是常量, 表示首元素的地址,不能改变 - 指针的存储空间:4/8字节
数组的存储空间:元素个数*元素存储空间
- 指针可以修改指向
char name[] = "song";
char *pn = name;
*pn = ‘a'; // 结果是:aong
char *name1 = "zhao";
printf("%s “,name1); // 可以直接这样输出
- 定义字符串有两种方式:
- 使用数组定义字符串——> 字符串变量 字符串元素可被改变
- 使用指针定义字符串——> 字符串常量 字符串元素不可以改变
定义:数组中的元素都是指针
char str1[3] = {"iOS", "Android", "HTML5"};
/*
str1[0] 是第一个字符指针,指向常量区的iOS
str1[1] 是第二个字符指针, 指向常量区的Android
str1[2] 是第二个字符指针, 指向常量区的HTML5
*/
char *name = "zhao"; //指向常量区
char *names[] = {"Android", "Java", "c#"}; //指向常量区
3. 指针与函数
void changeValue(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
// 指针作为函数参数进行传递,可以实现形参的改变,作用到实参
}
void printArray(int *a, int count){
for (int i = 0; i < count ; i ++) {
printf("%d ",*a++);
}
}
int main(){
int a[4] = {23, 45, 12, 78};
printArray(a, 4); // 指针作为形参
int *p = a;
printArray(p, 4); // 指针作为实参
}