前要:本笔记为初学者上b站翁恺C语言P82-P98所得笔记。学下来之后,是觉得如大众所说,指针是比较抽象的。然后字符串在学了指针和数组之后觉得还是可以理解的。
注意:笔记中绝大多数内容都与翁恺C语言P82之前的数组,函数等内容有连接,所以没学过那里的可能看不懂。
目录
10.2.1 单字符输入输出,用getchar和putchar
指针
9.1.1 取地址符 &
1.&:
def(意思是定义definition,缩写为def,下文均用缩写):取得变量的地址,注意,其操作数必须是变量,不能是常量。
eg.scanf("%d",&i):
2.输出地址
printf("%p",&i);
注:
1.地址一般默认16进制,结果字母为大写。
2. &i 才表示地址,","右侧用 i 无法输出I的地址,会输出i在16进制下的值。
3.%x,%X本用于输出16进制数(大写X结果字母均大写,小写x结果字母均小写),但也可以用于输出地址。与%p区别在于
%x与%X输出时不会刻意填满16位,而%p会,用0填满结果左侧。
如
%x ——65fe1c
%X——65FE1C
%p——000000000065FE1C
3.地址的字节数分析
在不同位数的操作系统,&i所占字节数不同:
32位中为4字节,64位中为8字节,
而Int始终为4字节
那这时我们来看一个问题
为什么 int i;scanf("%d,i) 编译没有报错?
因为32位时Int的值与地址字节数一致,且若i=6,它就放值进位置6,但位置6不能这样用,运行就不会得到想要的结果,而会得到15个0与一个6:0000000000000006.
4.&能取的和不能取的地址
&不能对没有地址的东西取地址(即必须是个变量) 则&(a+b),&(a+1)均不行。
关于可取地址变量的一些事:
1.相邻变量
地址会从大到小(32位下,逐渐减4,后面默认32位)
2.数组的地址,其单元的地址,相邻(下一个)变量地址三者之间的关系
&[a]=a=&a[0]=&a[1]-4;
注:1.数组名称a可直接做地址!其实就对应a[0]。
2.与相邻变量规则一样,数组下一个变量地址减4.
9.1.2指针
1.总起:
指针def:保存地址的变量
eg.
int i;
int *p=&i;(指针的定义)
注:
1.组成分析:(此处地址指i的地址)
*是一种单目运算符,表示访问地址所对应的变量。
p就是指针,是保存地址的变量。(p只是个起的名字,用什么都行,只是都习惯用p,因为point表示指针;再需要强调的是p本身不是指针,是因为和*一起自己才成指针。)
而*p是保存的地址所对应的变量的值,所以用int 来描述类型
2.大家看到这里不知道是否会疑惑:我能直接用i来做事,为何整出个*p这么绕的东西来搞?
别急,往后看
3.对于指针,个人建议刚学用图解可以更好地理解(地址这一点和变量的组合是比较让人头晕的)

2.先再解释一些结构:
int*p,q;
int *p,q:(这里我隔得很开,其实多少个空格都行)
解释:
1.*可以靠近int ,也可以远离int,意思不变;即上面两个式子意思一样。
2.这里两个式子都只定义了p为指针,想p q均定义为则用int*p,*q;,即在需定义的变量前加*
3.所以指针到底有什么用??
为什么我能直接用i这么简单的东西来做事,为何整出个*p这么绕的东西来搞人心态?
先摆结论:指针的用处体现在函数中。
我们都知道,在C中函数变量处于是一个变量空间中,这个空间是独立的,无法改变函数外的变量(不考虑返回值时),即使重名。那么,当我们用指针这种携带着变量地址的变量,我们便可以通过指针,去访问函数外面的i,进而实现在函数中实现改变函数外的量!
开玩笑的说,在函数中直接用I(指调入i),只能得到i的值(肉体),而无法得到i的灵魂!但指针可以!
4.怎么实操呢?
当我们用以下格式定义函数可以在函数被调用时得到某个变量的地址;
void f(int *p);
而当我们用以下格式在非函数区域输入代码则可以在函数里面通过这个指针去访问外面的i,进而去操作i,实现对它值的改变。
int i=0;f(&i)
举例图解:
i本身为6,用指针p在函数中i被访问,最后变成70

5.关于*与&
a.*的一些注意特点
*p可以做右值也可以做左值,eg.int k=*p;*p=k+1;
这里之所以要提左右值因为一般出现在赋值号左边的是变量,而这里是值,是表达式的结果,在这里是可以的。
b.指针运算符*与&的关系
先摆结论:*与&有类似相反作用的效果。
解释:
1.对比以下四个东西:(由此已可见原因之)
*是一种单目运算符,取出指针所存的地址所对应的变量。
&也是一种单目运算符,取出变量所对应的地址。
p是指针,是保存地址的变量。
*p是被保存的地址所对应的变量的值。
2.看一个问题:*&yptr是否等于&*yptr?(注:这里设计yptr做指针时指向变量y)
看似是,对吗?
*&yptr——*(&yptr)——*(yptr的地址)——得到了那个地址上的变量——yptr(一个普通变量)
&*yptr——&(*yptr)——&(y)——得到y的地址(但不是指针,指针是保存地址的变量)
由此可见不是,但依旧可以看出,&*有类似相反的作用。
9.1.3指针的应用
1.交换两个变量
#include<stdio.h>
void swap (int *pa ,int *pb);
int main()
{
int a=5;
int b=6;
int *p;
*p=0;
swap(&a,&b);
printf("a=%d,b=%d",a,b);
return 0;
}
void swap (int *pa,int *pb)
{
int t=*pa;
*pa=*pb;
*pb=t;
}
函数本身只能返回一个值,而想多值就得用指针来返回。
2.找数组的max与min
#include<stdio.h>
void minmax (int a[],int len,int *max,int *min);
int main(void)
{
int a[]={1,2,3,4,5,6,7,8,9,12,13,14,15,16,17,21,55};
int min,max;
printf("main sizeof(a)=%lu\n",sizeof(a));
printf("main a=%p\n",a);
minmax(a,sizeof(a)/s
本文详细介绍了C语言中的指针概念,包括取地址符、指针定义、指针运算及其应用,以及动态内存分配。同时,探讨了字符串的定义、常量、输入输出及常用函数。指针在函数参数传递、数组操作和多值返回等方面发挥重要作用,而字符串则通过字符数组和指针进行操作。动态内存分配函数malloc用于在运行时分配内存,而free用于释放内存。此外,文章还讨论了字符串函数如strlen、strcmp、strcpy等的使用。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



