博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
011-指针(上)-C语言笔记
阅读量:5934 次
发布时间:2019-06-19

本文共 11371 字,大约阅读时间需要 37 分钟。

学习目标

1.【掌握】字符串常用函数

2.【掌握】指针变量的声明

3.【掌握】指针变量的初始化

4.【掌握】函数与指针

5.【掌握】指针的数据类型

6.【掌握】多级指针

7.【掌握】指针与数组

一、字符串常用函数

puts和gets函数的声明在stdio.h头文件中,strcmp、strlen、strcpy、strcat函数的声明在string.h头文件中。

puts()函数

语法:puts(存储字符串数据的数组名);

输出一个字符串数据,并自动换行。不过只能输出字符串,并且不能使用格式控制符。

gets()函数

语法:gets(存储字符串数据的数组名);

从控制台接收一个字符串数据,并存储在制定的字符数组之中。并且能读取到空格,scanf不能读取。不过gets只能接收字符串。无论是gets函数还是scanf函数在接收字符串的时候都是不安全的。如果输入字符串长度不够的时候,就会出问题。

strcmp()函数

语法:strcmp(字符串1,字符串2);//返回int类型

根据每个字符对应的ASCII码依次比较两个字符串的每个字符的大小,如果比较到两个字符不同,就返回结果。如果返回正数,说明第一个字符串大,返回负数,说明第二个大。返回0,说明每个字符的ASCII相同。

strlen()函数

语法:strlen(字符串);

计算字符串的长度,一个一个字符计数,直到遇到'\0'为止。返回值是unsigned long。

strcpy()函数

语法:strcpy(字符串1,字符串2);

将字符串2拷贝到字符串1里,并且覆盖掉字符串1里的数据。如果字符串1放不下字符串2,就会保错。

strcat()函数

语法:strcat(字符串1,字符串2);

将字符串2中的数据追加到字符串1后面,不会覆盖,只会拼接。如果字符串1放不下字符串2,就会保错。

 

二、指针变量的声明

我们声明一个变量,实际是在内存中申请一个指定字节数的字节空间来存储数据,分配变量空间的时候,是从高地址到底地址来分配的。

概念:

1.变量的值:是存储在变量空间里的数据。

2.变量的地址:声明变量时申请到的字节空间中低字节的地址。

3.指针:变量的地址就叫做指针,地址就是指针,指针就是地址,只是换了个说法而已。

4.指针变量:其实也就是一个变量,只不过这个指针变量的值是个地址。

访问变量的两种方式:

1.直接访问:直接使用变量名来访问。

2.间接访问:让一个指针指向这个变量,通过这个指针可以间接的访问这个变量。

指针变量的声明

语法:

声明普通变量:数据类型 变量名;

声明指针变量:数据类型 *指针变量名;

注意:

指针变量名也是一个标识符,也需要符合变量的命名规则和规范。一般情况下,我们变量名都以p开头,这样让别人一眼都能看出是指针变量。

 

三、指针变量的初始化

指针变量中只能存储和指针变量类型相同的变量的地址,所以不能直接给指针变量赋值一个其他非地址的数据。使用&取地址运算符可以获取变量的地址。

语法:数据类型 *指针变量名 = 相同数据类型的变量的地址;

通过指针变量访问指针变量指向的普通变量,使用*取值符来取出指针变量指向的普通变量。

注意:

野指针:声明一个指针变量而没有初始化,这个指针变量的值是一个随机内存地址。通过这个指针去为指针指向的空间赋值的时候,就有可能改掉别人的数据,造成崩溃。

空指针:声明一个指针变量的时候不确定指向哪个变量,可以给他赋值NULL或者0(这里0就代表NULL,不是整型0),代表这个指针不指向任何空间。

四、函数与指针

在函数中操作实参

 

五、指针的数据类型

通过指针操作指针指向的变量的时候,只能找到被指向那个变量的低字节的地址,到底要操作几个字节的空间是根据指针的类型来决定的。例如:

原理:这里指针操作指针指向的变量的时候,指针认为他指向的是int类型的变量,int类型占4个字节的空间,所以操作了4个字节的空间。

六、多级指针

一级指针:如果一个指针变量中存储的是一个普通变量的地址,那么这样的指针就叫做一级指针。

二级指针:如果一个指针变量中存储的是一个一级指针变量的地址,那么这样的指针就叫做二级指针。

三级和多级同理。

 

七、指针与数组

指针可以和整数进行加减运算

遍历数组大法:

指针数组:

所谓的指针数组,指的是一个专门用来保存多个相同数据类型指针的数组。

#include <stdio.h> int main(int argc, const char * argv[]) { int num1 = 10; int num2 = 20; int num3 = 30; int *p1 = &num1; int *p2 = &num2; int *p3 = &num3; int *arr[] = {p1,p2,p3}; int **p4 = arr; for (int i = 0; i < 3; i++) { printf("%d\n",**(p4 + i)); } return 0; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
int
main
(
int
argc
,
const
char
*
argv
[
]
)
{
    
    
int
num1
=
10
;
    
int
num2
=
20
;
    
int
num3
=
30
;
    
    
int
*
p1
=
&
num1
;
    
int
*
p2
=
&
num2
;
    
int
*
p3
=
&
num3
;
    
    
int
*
arr
[
]
=
{
p1
,
p2
,
p3
}
;
    
int
*
*
p4
=
arr
;
    
    
for
(
int
i
=
0
;
i
<
3
;
i
++
)
{
        
printf
(
"%d\n"
,
*
*
(
p4
+
i
)
)
;
    
}
    
    
return
0
;
}

 

 

转载于:https://www.cnblogs.com/liehuntianshi/p/4862387.html

你可能感兴趣的文章
CSRF verification failed. Request aborted. 解决方法
查看>>
Python之Scrapy爬虫框架安装及简单使用
查看>>
U盘信息获取
查看>>
C# 实现多线程的同步方法详解
查看>>
Java多线程之Lock的使用
查看>>
安全过滤函数
查看>>
CODEVS_1227 方格取数2 网络流 最小费用流 拆点
查看>>
app设计摘要
查看>>
devexpress总结 accordionControl 加载panelcontrol 的快捷方式
查看>>
centos 配置svn+apache
查看>>
Silverlight 样式的灵活使用
查看>>
常用排序算法:归并排序
查看>>
Python: 矩阵与线性代数运算
查看>>
判断两条直线 共线或 平行 或相交 求交点 叉乘的应用 poj 1269 Intersecting Lines...
查看>>
HDU-4534 郑厂长系列故事——新闻净化 AC自动机+DP
查看>>
可拖动的div
查看>>
记录基于VMware虚拟机, Linux7.2下外部主机访问配置
查看>>
Java进阶之美文共享
查看>>
实验吧_认真一点(各种绕过下的盲注)
查看>>
OAuth
查看>>