指针的初级知识点总结

◆指针可以称得上是C语言的灵魂,正因为有了指针这一强大的功能,让C语言操作的灵活度能够达到一个更高的层次,同时使得C语言在各类编程语言中拥有不可取缔的地位。初学时感到C语言中的指针的相关知识点很繁琐,也很绕,进而许多概念极易混淆,特此整理指针的初级相关知识点。

1. ★指针的概念

地址与指针?

地址:C程序中的变量在占有一个可标识的存储区,每一个存储区是由若干字节组成,而每一个字节都有自己的地址,而一个存储区的地址则为该存储区第一个字节的地址。(&)

存储区访问:存储区的访问方式有直接访问和间接访问两种,直接访问顾名思义就是通过变量名或地址访问变量的存储区,间接访问则为一个变量的地址存放在另一个变量中。如:将X的地址放到P中,访问X时先找到P,再由P中存放的地址找到X。

指针:一个变量的指针则为该变量的地址(指针在某种程度上就是地址),而指针变量就是存放变量地址的变量,用来指向另一个变量。

2. ★指针变量的引用:

指针运算符(*)

例:p和*p。p与*p不同,p是指针变量,p的值是p所指向的变量的地址。*p是p所指向的变量,*p的值是p所指向的变量的值。

C中函数调用是按值传递的,传入参数在子函数中只是一个初值相等的副本,无法对传入参数作任何改动。但实际编程中,经常要改动传入参数的值。这一点我们可以用传入参数的地址而不是原参数本身,当对传入参数(地址)取(*)运算时,就可以直接在内存中修改,从而改动原想作为传入参数的参数值。如下该例:

#include<stdio.h>
void fun(int *val)
{
(*val)++;
}
Int main()
{
Int a=3;
fun(&a);
printf(“%d”,a);
return 0;
}

注:在执行inc(&a);时,系统在内存分配表里增加了一行”fun中的val”,其地址为新地址,值为&a。操作*val,即是在操作a 了。

3. ★*和&运算

 “*”运算:(*p)操作是这样一种运算,返回p 的值作为地址的那个空间的取值。”&”运算:(&p)则是这样一种运算,返回当时声明p 时开辟的地址。显然可以用赋值语句对内存地址赋值。

※注:两个地方要注意:在程序声明变量的时候的*,只是表明“它是一个无符号整数,这个整数指向某个内存地址,一次访问sizeof(type)长度”,这点不要和(*)操作符混淆;在C++程序声明变量的时候的&,只是表明“它是一个引用,这个引用声明时不开辟新空间,它在内存分配表加入新的一行,该行内存地址等于和调用时传入的对应参数内存地址”,与(&)操作符不同。



4. ★指针的初始化

对指针进行初始化或赋值只能使用以下四种类型的值:

①.0值常量表达式,例如,在编译时可获得0值的整型 const对象或字面值常量0。

②.类型匹配的对象的地址

③.另一对象末的下一地址

④.同类型的另一个有效指针。

注:把int型变量赋给指针是非法的,尽管此int型变量的值可能为0。但允许把数值0或在编译时可获得0值的const量赋给指针。



5. ★指针数组,数组指针,函数指针

①指针数组:就是一个由指针组成的数组,那个数组的各个元素都是指针,指向某个内存地址。char *p[10]中p是一个指针数组。指针数组的运用可以作为函数的参量使用,使用方式与普通数组类似。并且指针数组常适用于指向若干字符串,这样使字符串处理更加灵活方便。

②数组指针:数组名本身就是一个指针,指向数组的首地址。注意这是一个常数。char (*p)[10]中p是一个数组指针。其本质为指针(这个指针存放的是数组首地址的地址,相当于2级指针,这个指针不可移动)。例如:

{
int a[4][5];
int (*p)[5]=a;
}

※注:这里a是个二维数组的数组名,相当于一个二级指针常量;p是一个指针变量,它指向包含5个int元素的一维数组,此时p的增量以它所指向的一维数组长度为单位;*p+i是二维数组a[0][i]的地址;*(p+2)+3表示a[2][3]地址(第一行为0行,第一列为0列),*(*(p+2)+3)表示a[2][3]的值。

※对于二维数组来说:二维数组:如char str[10][10]只要定义了一个二维数组,无论赋不赋值,系统都会给他分配相应空间,而且该空间一定是连续的。其每个元素表示一个字符。我们可以通过指定下标对其元素进行修改。而指针数组:如char *str[5]系统至少会分配5个连续的空间用来存储5个元素,表示str是一个5个元素的数组,每个元素是一个指向字符型的一个指针。

总结:相比于比二维字符数组,指针数组有明显的优点,一是指针数组中每个元素所指的字符串不必限制在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。 但是二维字符数组却可以通过下标很方便的修改某一元素的值,而指针数组却无法这么做。

③函数指针:本身是一个指针,指向一个函数入口地址,通过该指针可调用其指向的函数,使用函数指针可实现回调函数。 常见的函数体中其本身是一个函数,其返回值是一个指针的形式。



6. ★指针与引用(C++风格)

不同点:

①.指针是一个实体,而引用仅是个别名。

②.引用使用时无需解引用(*),指针需要解引用。

③.引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”。

④引用没有const,指针有const,const的指针不可变。

⑤引用不能为空,指针可以为空。

⑥引用是类型安全的,而指针不是(引用比指针多了类型检查)。

“sizeof引用”得到的是所指向的变量(对象)的大小,而“sizeof指针”得到的是指针本身(所指向的变量或对象的地址)的大小。

相同点:两者都是属于地址范畴的概念,指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。

时间: 2024-10-10 00:48:22

指针的初级知识点总结的相关文章

C#初级知识点整理及VS的简单使用

C#预处理器指令#define #undef 声明一个不需赋值的变量注意的一点事它必须放到using 上面,如 #define TEST using System.xxx; public class Task { public Task() { } } #region #endregion这是一组用来帮助管理代码布局的指令 #if #else #elif #endifif else 没什么好说的.不过这个一般要跟#define搭配使用 #warn #error输出警告或错误 #if DEBUG

C++ 指针与引用 知识点 小结

[摘要] 指针可以指向变量.数组.字符串.函数.甚至结构体.即指针可以指向不同数据对象.指针问题 包括 常量指针.数组指针.函数指针.this指针.指针传值.指向指针的指针 等.主要知识点包括:1.指针与引用在概念上的三个区别及其在const.sizeof.自增运算上的差异:2.熟记经典swap函数的指针实现与引用实现,并能反映输出错误的两个函数的思想弊端:3.熟记GetMem函数的错误形式以及错误产生的原因:4.比较数组.指针与静态变量作为函数返回值的差异:5.str.*str以及&str三者

黑马程序员-关于C语言的指针一些小知识点

------- IOS培训.android培训.java培训.期待与您交流! ---------- c语言的难点和精华部分就是指针,能够将指针完全理解并且将其运用熟练不是一件容易的事情,其中有几个知识点比较绕一些. 1.数组指针与指针数组的区别.  数组指针是一个指针,是指向数组的指针,就如同int*,char*型指针,只不过它是指向数组的(首元素),大小为4(32位平台下),通过它就可以做找到整个数组. 1 #include <stdio.h> 2 int main(int argc, ch

c++0.1-----不包含指针的类~~~知识点大综合

本篇文章包含知识点有:预编译,访问权限,内联函数,常成员函数,构造函数,运算符重载函数,友元. 以代码为示范: 文件名:ccompex.h 文件内容:定义一个简单的复数类. 1 #ifndef __CCOMPLEX__ 2 #define __CCOMPLEX__ 3 #include <iostream> 4 #include <ostream> 5 using namespace std; 6 class complex{ 7 friend complex& __doa

对指针的初级理解

一.什么是指针指针是一个变量,用来存放地址的变量.有如下代码:#include <stdio.h>int main(){int a = 10;int p = &a;return 0;}对于这个有这样一个图解:这里的p就是一个一级指针,它指向a的地址,而a存放的是地址内容.二.二级指针二级指针就是指向指针的指针,它的变量是指针变量.如下:#include<stdio.h>int main(){int a=10;int pa=&a;int *ppa=&pa;re

linux初级知识点整理

1.配置linux的IP地址有两种方法 方法一:dhclient自动获取IP地址 方法二:手动配置IP地址 vi /etc/sysconfig/network-scripts/ifcfg-eth0 进入配置文件后修改如下: ONBOOT=yes BOOTPROTO=static IPADDR=192.168.31.170(如为虚拟机,则需要与真机处于同一网段) NETMASK=255.255.255.0 GATEWAY=192.168.31.1(真实网关) DNS1=8.8.8.8(可配置两个D

初级知识点总结

1.get请求和post请求的区别 get请求 post请求 get请求参数会在URL中 post请求的数据是在请求的包中 请求长度<= 1024字节(HTTP协议本身没有这个限制,是特定的浏览器和服务器对它的限制 理论上讲post请求长度没有限制,但这取决于服务器的处理能力.对于ASP程序,Request对象处理每个表单域时存在100K的数据长度的限制,但如果使用Request.BinaryRead则没有这个贤惠. 后端获取数据的时候用Request.QueryString() Requst.

HTML初级知识点

简介: 1)HTML指的是超文本标记语言(Hyper Text Markup Language),HTML文档包含HTML标签和纯文本. <html>与</html>标签之间,定义了整个HTML文档. <head>与</head>标签之间,定义文档的头部.<base><meta><link><script><style><title>可用在其中. <body>与</bo

单片机教程.指针的基础与1602液晶的初步认识

指针的基础与1602液晶的初步认识 我们在上C语言课的时候,学到指针,每一位教C语言的老师都会告诉我们一句:指针是C语言的灵魂.由此可见,指针是否学会是判断一个人是否真正学会C语言的重要指标之一,但是很多同学只知道其重要性,却没学会其灵活性. 简单的程序,100来行代码,不需要指针我们可以轻松搞定,但是当代码写到几千上万行甚至更多的时候,利用指针就可以直接而快速的处理内存中的各种数据结构中的数据,特别是数组.字符串和内存的动态分配等,它为函数之间各类数据传递提供了简洁便利的方法.说了这么多作用估