前言:本人于今日温习c语言浙大翁凯老师的9.1.2指针时记录笔记和感悟如下

·建议:复制到vs编译器查看

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
//assume we can 将一个取得的变量所在的地址去传递给一个变量(函数),
//那么,我们可以通过这个地址在那个传递的变量(函数)内部去访问这个取得的变量。这个保存地址的变量长啥样,啥类型呀?
//答:这个保存取得的变量所在地址的函数(函数)是一种类型为“指针”的变量。 int* p
//
//1·指针类型变量里面所保存的值就是对应赋值变量的内存的地址,这个地址会指向对应的赋值变量;
// 这句话含义:可以说普通变量的值是实际的值,指针变量的值是指向的(对应的赋值变量)的变量的地址。
//
//2·写法:我们常见的定义属性的省略写法在给多个指针变量定义时是行不通的如:int*p,q;(p为指针而q为普通的整型变量),
//换句话说我们不是把*给了int,而是把*给p,我们说*p是一个int于是p便是一个指针了;而不是int*这种类型。
//
//3·当指针作为函数的参数的时候:EX:void f(int *p);意思是f函数要一个int的指针,
//当我们调用f函数的时候,我们需要交给f函数这个p的地址,而不能交给他这个变量本身;
//
//4·对于指针类型变量读操作:%p为指针类型变量的占位符,配合printf使用%p会将对应变量值转换为变量的地址(16进制)。
//
//5·对于指针变量的写操作,即想改变指针所指向的变量的值,要怎么操作呢?
//·使用*访问指针的值所表示的地址上的变量(访问的是这个指针变量指向的变量,是变量!);
//·*指针名,可以做左值也可以做右值。例如:int k = *p;*p=k+1;——也就是说,我们可以将*指针放入赋值号的右边读他的值
//·*是一个单目运算符,用来访问指针的值所表示的那个地址上的变量;
//·复习一下c语言中的单目运算符:逻辑非运算符 !、自增自减运算符 ++ --、负号运算符 -、类型转换运算符(类型)、指针运算符和取地址运算符 *和&、长度运算符 sizeof、按位取反运算符 ~
//6·扩展一下(很重要):*左值之所以叫左值的原因:
//是因为我们在运算过程中出现在赋值号左边的不是变量而是值!,是表达式计算的结果,
//例如:a[0] = 2,左侧是数组a的第一个元素的值,再比如*p = 3,左侧是取得p这个指针的地址所代表的变量的值
//7·指针的复合运算符:&*(*和&类似一组互逆运算)
// ·原理:我们知道&代表取出这个变量的地址,如&a表示取出a变量的地址,*代表根据指针的地址取出其指向的变量;
// ·先取得地址的地址 -转化-> 地址上地址的变量也就是地址;*&yptr -> *(&yptr) ->*(yptr的地址)—>的到yptr的地址上的变量->ytpr
// ·先取得地址指向的变量 -转化-> 变量所对应的地址:&*ytpr -> &(*yptr) ->&(y) ->得到y的地址ytpr->ytpr
/*·5的实验:* p的含义
int main()
{
int i = 6;
int* p = &i;
//· *表示根据指针指向数据的地址取出其指向的变量
printf("*p=%x\np=%x", *p, p);
}
*/
/*·3的实验:当指针作为函数的参数是我们需要给函数指针变量而不能给变量:
void f(int* c)
{
printf("%p\n", c);
}
void main()
{
int x = 2; int y = 3;
int* px = &x; int* py = &y;
f(px);//当变量为x的时候编译错误
f(py);
}
*/