C语言学习之指针知识总结

目录
  • 一、地址
  • 二、指针与指针变量
  • 三、指针的作用
  • 四、初学指针时常见的错误
  • 五、通过调用函数修改主调函数中的值
  • 六、指针与一维数组
  • 七、使用函数操作一维数组
  • 八、指针变量所占字节数
  • 九、静态数组的缺陷
  • 十、malloc函数
  • 十一、动态数组的构造
  • 十二、静态内存与动态内存的对比
  • 十三、多级指针
  • 十四、跨函数使用内存

一、地址

内存中的最小单元是字节,一个字节对应一个编号,这里的编号就是对应字节的地址。换句话说,地址就是内存单元的编号。

二、指针与指针变量

指针与指针变量是两个不同的概念,指针是某个普通变量的地址,所以可以理解为,指针就是地址,地址就是指针。指针变量是一种变量,它的作用是存储其它变量的地址。

#include <stdio.h>

int main()
{
	int * p; // int *是指针类型,p是对应的变量,定义的指针变量p只能用来存储int类型变量的地址
	int i = 3, j;

	p = &i; // 指针变量只能用来存储对应类型变量的地址,所以这里需要对变量i进行取地址操作,即&i
	/*
		指针变量p保存了变量i的地址,这样的话,我们称:p指向i。通俗地说,通过p可以找到i
		虽然p指向i,但变量p和变量i不是同一个变量
		更准确地说,修改其中任何一个变量p值不会影响变量i,反之同理
	*/

	printf("%d %d\n", *p, i);
	/*
		如果一个指针变量指向某个普通变量,则在指针变量前加上*后就完全等同于指向的普通变量
		换句话说,可以通过指针变量前加*来找到那个指向的普通变量
		以本程序为例,这里的*p就是以p的内容为地址的变量
	*/

	j = *p; // *p就是i,所以相当于将i的值赋给了j
	printf("i = %d, j = %d\n", i, j); // 输出结果为i = 3, j = 3

	return 0;
}

三、指针的作用

指针是C语言的灵魂

  • 通过指针可以表示一些复杂的数据结构,例如,链表、树、图等
  • 通过指针可以提高传输效率
  • 利用指针可以在被调函数中修改主调函数中的多个值
  • 利用指针可以直接访问硬件
  • 通过指针可以更方便地处理字符串
  • 指针是理解面向对象语言中引用的基础

四、初学指针时常见的错误

错误1:指针变量无明确指向

#include <stdio.h>

int main()
{
	int * p;
	int i = 5;

	*p = i; // 出错行
	printf("%d\n", *p);

	return 0;
}

错误原因:由于p未初始化,所以p的内容是垃圾值。*p是以p的内容为地址的变量,即以一个垃圾值为地址的变量,该变量是未知的,所以当把i的值赋值给p指向的未知变量时,有可能会篡改内存中其它变量的值,而这样的操作是不允许的。

错误2:赋值时变量类型不一致

#include <stdio.h>

int main()
{
	int * p;
	int * q;
	int i = 5;

	p = &i;

	*q = p; // 出错行
	printf("%d\n", *q);

	return 0;
}

错误原因:由于p是指针类型变量,而*q是int类型变量,所以不能相互复制。

五、通过调用函数修改主调函数中的值

思考1:在下述程序中,f函数中的变量i与main函数中的变量i是不是同一个变量?

f函数中的变量i与main函数中的变量i都属于局部变量,只在自己对应的函数中起作用,所以,f函数中的变量i与main函数中的变量i不是同一个变量。

#include <stdio.h>

void f(int i)
{
	i = 99;
}

int main()
{
	int i = 66
	printf("%d\n", i);

	f(i);
	printf("%d\n", i);

	return 0;
}

思考2:在上述程序中,能否通过调用f函数修改main函数中变量i的值?

由于f函数中的变量i与main函数中的变量i不是同一个变量,所以把实参i传递给形参i只会改变f函数中变量i的值,当f函数执行完毕后,分配给形参i的空间会被释放,故而无法改变main函数中变量i的值。换句话说,f函数中的变量i与main函数中的变量i本质上没有任何关系,所以不管怎么修改f函数中变量i的值都不会影响main函数中变量i的值。

那要如何才能通过其它函数来修改主调函数中的值?

此时,指针就派上用场了,如下述程序:

#include <stdio.h>

void f(int * p) // 通过接收地址来确定要修改的变量
{
	*p = 99; // *p就是以p变量的内容为地址的变量,也就是要通过该函数修改的变量
}

int main()
{
	int i = 66
	printf("%d\n", i); // 输出结果为66

	f(&i); // 由于函数f的形参是指针变量,故需将变量i的地址发送过去
	printf("%d\n", i); // 输出结果为99

	return 0;
}

上述程序可以实现在被调函数中修改主调函数中变量的值是因为通过向被调函数传递了需要修改的变量的地址,从而确定并指向了需要修改的变量,但如果不传入地址,就会导致主调函数中的变量无法与被调函数产生关联,从而无法实现目的。

活学活用:自定义一个swap函数,用该函数互换main函数中的两个变量的值

常见错误:只传入数值,不传入地址

void swap(int a, int b)
{
	int t;

	t = a;
	a = b;
	b = t;
}

int main()
{
	int a = 3, b = 5;

	swap(a, b);

	printf("a = %d, b = %d\n", a, b);

	return 0;
}

出现上述错误的原因是,main函数中的变量a和b与swap函数中的形参a和b无关,导致的结果是,主函数将3和5发送给形参a和b后,swap函数只是对3和5进行了操作,而未能对main函数中的变量a和b进行操作,所以无法互换main函数中的变量a和b的值。

正确实现方法:传入地址,定位需要互换的变量

void swap(int * p, int * q)
{
	int t;

	t = *p;
	*p = *q;
	*q = t;
}

int main()
{
	int a = 3, b = 5;

	swap(&a, &b);

	printf("a = %d, b = %d\n", a, b);

	return 0;
}

思考:如下方法是否可以实现互换功能?

#include <stdio.h>

void swap(int * p, int * q)
{
	int * t;

	t = p;
	p = q;
	q = t;
}

int main()
{
	int a = 3, b = 5;

	swap(&a, &b);

	printf("a = %d, b = %d\n", a, b);

	return 0;
}

答案是不行的,上述程序将变量a和b的地址发送给了指针变量p和q,此时,变量p和q中储存的是变量a和b的地址,然而,swap函数中的操作是互换变量p和q的内容,也就是说,当swap函数执行完毕后,变量p中储存的是变量b的地址变量q中储存的是变量a的地址,言下之意,只是将变量p和q的内容互换了而已,并没有对main函数中的变量a和b进行操作,所以无法实现互换功能,此外,几乎所有的编程语言都无法通过互换两个变量的地址实现互换变量中的值。

六、指针与一维数组

一维数组的数组名

一维数组的数组名是一个指针常量,该常量是一维数组中第一个元素的地址。

#include <stdio.h>

int main()
{
	int a[5];
	int b[5];

	a = b; // 错误,因为a和b都是常量,所以无法进行赋值操作
	a = &a[2]; // 错误,因为a是常量,无法对一个常量进行赋值操作

	return 0;
}
#include <stdio.h>

int main()
{
	int a[5];

	printf("%#X", &a[0]);
	printf("%#X", a); // 与上一行输出结果相同,因为一维数组名就是数一维组中第一个元素的地址

	return 0;
}

引用一维数组中的元素

通过下标引用:如a[i]表示第i+1个元素

通过指针引用:如*(a+i)表示第i+1个元素

#include <stdio.h>

int main()
{
	int a[5];
	int i;

	for (i = 0; i < 5; i++) // 向一维数组中读入元素
		scanf("%d", &a[i]); // 通过下标引用数组中的元素

	for (i = 0; i < 5; i++) // 输出一维数组的内容
		printf("%d ", *(a + i)); // 通过指针引用数组中的元素

	return 0;
}

指针变量的运算

指针变量不能相加,相乘以及相除,只能进行相减。如果两个指针变量指向同一块连续空间的不同存储单元,则这两个指针变量才可以进行相减运算。两个指针变量相减得到的结果是两个指针变量间相隔的元素个数。

#include <stdio.h>

int main()
{
	int a[5];
	int * p = &a[1];
	int * q = &a[4];

	printf("%d\n", q - p); // 输出结果为3,证明相隔3个元素

	return 0;
}

七、使用函数操作一维数组

使用函数对一维数组进行操作,首先要将数组名传递给函数,因为一维数组名是函数第一个元素的地址,传递数组名就相当于传递起始位置,其次,普通数组不同于字符数组,它们没有结束的标志,所以还需要向函数传递数组长度以确定数组何时结束。故想要在另外一个函数中对一维数组进行操作需要向该函数传入两个参数,数组名和数组长度。

定义函数时的形参有两种写法,第一种是(int a[], int length),第二种是(int * a, int length)。可以写第二种的原因是一位数组名本身就是指针常量,所以可以直接用指针变量来接收。

定义一个函数,该函数的功能是对一维数组的内容进行输出

#include <stdio.h>

// 自定义的print函数,其功能是将一维数组输出
void print(int a[], int length)
{
	int i;

	for (i = 0; i < length; i++)
		printf("%d ", a[i]); // 也可以写成printf("%d ", *(a+i));

	printf("\n");
}

int main()
{
	int a[5] = { 1, 2, 3, 4, 5 };
	int b[6] = { -1, -2, -3, -4, -5, -6 };
	int c[100] = { 23, 88, 99, 44 };

	print(a, 5);
	print(b, 6);
	print(c, 100);

	return 0;
}

八、指针变量所占字节数

预备知识:sizeof运算符的用法

sizeof(数据类型):其值为对应数据类型所占的字节数

例如:sizeof(int)值为4;sizeof(double)值为8;sizeof(char)值为1

sizeof(变量):其值为对应变量所占的字节数

#include <stdio.h>

int main()
{
	char c = 'A';
	int i = 99;
	double x = 66.66;

	char * p = &ch;
	int * q = &i;
	double r = &x;

	printf("%d %d %d\n", sizeof(c), sizeof(i), sizeof(x)); // 输出结果为1 4 8
	printf("%d %d %d\n", sizeof(p), sizeof(q), sizeof(r)); // 输出结果均为4

	return 0;
}

上述程序证明,尽管普通类型变量所占的空间大小不一致,但它们对应的指针变量都占四个字节。

九、静态数组的缺陷

数组长度必须事先指定,且只能是常整数,不能是变量

数组的长度在长度不能在函数执行过程中动态的增减,数组一旦定义,其长度就无法改变

程序员无法手动释放静态数组的内存,数组一旦定义,操作系统为该数组分配的存储空间就会一直存在,直到该数组所在的函数执行完毕后,该数组的空间才会被操作系统释放

在某个函数内定义的静态数组在该函数执行期间可以被其它函数使用,但当该函数执行完毕后,该函数中定义的数组就无法在其它函数中使用,这是因为该函数执行完毕后,静态数组的内存就被会被释放

十、malloc函数

malloc这个词是由memory(内存)与allocate(分配)这两个单词合成的,顾名思义,malloc函数就是用来分配内存的函数。

#include <stdio.h>
#include <malloc.h>

int main()
{
	int i; // 静态分配了4个字节的存储空间

	int* p = (int*)malloc(4);
	/*
		1.要使用malloc函数,需添加malloc.h头文件
		2.malloc函数只有一个形参,其类型为整型
		3.实参中的4表示请求操作系统为本程序分配4个字节的动态存储空间
		4.malloc的返回值是分配给该系程序的第一个字节的地址
		5.由于第一个字节的地址不能确定具体的变量类型,所以需要强制类型转换
		6.第7行代码一共分配了8个字节的存储空间,其中变量p占4个字节,p指向的空间也占是4个字节
		7.变量p所占的内存是静态分配的,p所指向的内存是动态分配的
	*/

	free(p);
	/*
		free(p)表示释放p所指向的内存
		free函数只能用来释放动态内存,不能用来释放静态内存,静态内存只能由操作系统自动释放
		free(p)只是释放了p对应的内存空间,但p的内容依旧存在
	*/

	return 0;
}

十一、动态数组的构造

#include <stdio.h>
#include <malloc.h>

int main()
{
	int a[10]; // 静态构造一维数组
	int length;
	int* pArray;
	int i;

	scanf("%d", &length);

	pArray = (int*)malloc(sizeof(int) * length);
	/*
		动态构造一维数组
		该动态数组数组名为pArray,数组长度为length,数组中每个元素都是int类型
	*/

	// 对该动态一维数组手动赋值
	for (i = 0; i < length; i++)
		scanf("%d", &pArray[i]);

	// 输出该动态一维数组的内容
	for (i = 0; i < length; i++)
		printf("%d ", *(pArray + i));

	printf("\n");

	free(pArray); // 释放该动态数组

	return 0;
}

十二、静态内存与动态内存的对比

静态内存是由操作系统自动分配,自动释放的。静态内存是在栈中分配的;动态内存是由程序员手动分配,手动释放,但如果只分配不释放就会导致内存泄露,也就是内存越用越少。动态内存是在堆中分配的。

十三、多级指针

#include <stdio.h>

int main()
{
	int i = 10;
	int * p = &i;
	int ** q = &p;
	int *** r = &q;

	r = &p; // 错误,因为r是int *** 类型,它只能用来存储int ** 类型变量的地址

	printf("i = %d\n", ***r);

	return 0;
}

表解上述程序:

变量名 变量地址 变量内容
i 1000H 10
p 2000H 1000H
q 3000H 2000H
r 4000H 3000h
变量名 对应变量
*r q
**r p
***r i
#include <stdio.h>

void g(int ** q) // 由于p的类型是int *,所以q的类型必须是int **,因为q要用来存放p的地址
{

}

void f()
{
	int i;
	int * p;

	p = &i;

	g(&p); // 要通过g函数修改p的内容,则必须发送p变量的地址
}

int main()
{
	f();

	return 0;
}

十四、跨函数使用内存

由于静态内存是在栈中分配的,而函数执行完毕后,栈中的静态内存就会全部出栈,而动态内存是在堆中分配的,当函数执行完毕后,堆中分配的内存并不会像栈中分配的内存一样直接被释放掉,所以

静态内存是不能跨函数使用的,而动态内存是可以的。

思考:下述程序是否有语法错误?是否有逻辑错误?

#include <stdio.h>

void f(int** q)
{
	int i = 5;

	*q = &i; // 由于q储存了p的地址,所以*q就是p,这行代码实质是将i的地址赋给了p
}

int main()
{
	int* p;

	f(&p);

	printf("i = %d\n", *p); // 由于p储存了i的地址,所以*p就是i

	return 0;
}

上述程序没有语法错误,但是有逻辑上的错误,这是因为,当f函数执行完毕后,f函数中所有的静态变量的内存都会被释放掉,所以当执行到printf("i = %d\n", *p);时,p所指向的变量空间的访问权限已经返还给了操作系统,这样就会导致*p访问了不属于该程序的空间。这个程序说明了在一个函数内部定义的静态变量在该函数中执行完毕后就不再可以垮函数使用。

思考:对比上一程序,下述程序是否有语法错误?是否有逻辑错误?

#include <stdio.h>

void f(int** q)
{
	*q = (int*)malloc(sizeof(int));

	**q = 5;
}

int main()
{
	int* p;

	f(&p);

	printf("%d\n", *p);

	return 0;
}

上述程序是完全没有语法错误的,因为当f函数执行完毕后,其中分配的动态内存不会自动释放,所以在main函数中依然可以使用这段内存。这个程序体现出,在一个函数中分配的动态存储空间在该函数执行完之后,仍然可以在另外一个函数中使用。

趁热打铁:下列四个程序中,哪个程序能够通过调用fun函数使main函数中的指针变量p指向一个合法的整型单元?

#include <stdio.h>

void fun(int * p)
{
	int s;
	p = &s;
}

int main()
{
	int * p;

	fun(p);

	return 0;
}
#include <stdio.h>

void fun(int ** p)
{
	int s;
	*p = &s;
}

int main()
{
	int * p;

	fun(&p);

	return 0;
}
#include <stdio.h>
#include <malloc.h>

void fun(int * p)
{
	p = (int *)malloc(sizeof(int));
}

int main()
{
	int * p;

	fun(p);

	return 0;
}
#include <stdio.h>
#include <malloc.h>

void fun(int ** p)
{
	*p = (int *)malloc(4);
}

int main()
{
	int * p;

	fun(&p);

	return 0;
}

以上就是C语言学习之指针知识总结的详细内容,更多关于C语言指针的资料请关注我们其它相关文章!

(0)

相关推荐

  • 带你分分钟玩转C语言指针

    目录 何为指针 数组指针 指针数组 字符串数组 数组指针的sao气操作 二级指针 函数指针 指针函数 文件指针 总结 何为指针 指针这玩意说白了,就是用来存储一个变量地址的东东 如图: (编辑器为vc2010) #include<stdio.h> void main(){ int a,*p; a=5; p=&a; printf("a=%d,p=%p,*p=",a,p,*p); getchar(); } 所以通过刚刚的情况,我们发现通过指针我们不仅可以获取一个变量的值

  • C语言超详细讲解指针的概念与使用

    目录 一.指针与一维数组 1. 指针与数组基础 2. 指针与数组 3. 一个思考 二.指针与字符串 三.指针和二维数组 1. 指针数组与数组指针 2. 指针数组 3. 数组指针 一.指针与一维数组 1. 指针与数组基础 先说明几点干货: 1. 数组是变量的集合,并且数组中的多个变量在内存空间上是连续存储的. 2. 数组名是数组的入口地址,同时也是首元素的地址,数组名是一个地址常量,不能更改. 3. 数组的指针是指数组在内存中的起始地址,数组元素的地址是指数组元素在内存中的其实地址. 对于第一点数

  • C语言清楚了解指针的使用

    目录 前言 字符指针 指针数组 数组指针 函数指针 前言 经过了指针的初步学习,我们了解了指针有以下特点: 1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间. 2. 指针的大小是固定的4/8个字节(32位平台/64位平台). 3. 指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限. 4. 指针的运算. 今天将要从各种不同的指针的角度切入,使得我们对指针的了解更加深入. 字符指针 我们现在已经学会下面的这种指针的使用了: int main() { char

  • C语言指针超详细讲解上篇

    目录 前言 1.指针是什么 1.1 指针变量 1.2 指针是内存中一个最小单元的编号 2.指针和指针类型 2.1 指针±类型 2.2 指针的解引用 2.2.1 int* 类型的解引用 2.2.2 char* 类型的解引用 3.野指针 3.1 野指针成因 3.1.1 指针未初始化 3.1.2 指针越界访问 3.1.3 指针指向的空间释放 3.2 如何规避野指针 总结 前言 本文开始指针相关内容的学习,主要内容包括: 指针是什么 指针和指针类型 野指针 指针运算 指针和数组 二级指针 指针数组 1.

  • C语言指针超详细讲解下篇

    目录 前言 指针运算 指针±整数 4.1 指针±整数 4.2 指针-指针 4.3 指针的关系运算 5.指针和数组 6.二级指针 7.指针数组 7.1 举例 1 7.2 举例 2 总结 前言 本文接着上一篇内容,继续学习指针相关知识点. 指针运算 指针±整数 指针-指针 指针的关系运算 4.1 指针±整数 #define VALUE 5 int main() { float values[VALUE]; float *vp; //指针+-指针,关系运算 for (vp = &values[0];

  • C语言详细讲解指针数组的用法

    目录 1. 指针数组定义方法 2. 指针的指针(二级指针) 3. 字符串和指针 4. 数组指针 定义方法 数组指针的用法 1. 指针数组定义方法 格式: 类型说明符 *数组名[ 元素个数 ] int *p[10]; // 定义了一个整型指针数组p,有10个元素,都是int *类型的变量 指针数组的分类: 同指针类型的分类,见上一篇 大多数情况下,指针数组都用来保存多个字符串. #include <stdio.h> int main() { char *name[5] = {"Hell

  • C语言简明介绍指针的使用

    目录 1. 指针类型 2. 野指针 3. 指针的运算 3.1 指针+-整数 3.2指针-指针 3.3 指针的关系运算 4. 指针数组 1. 指针类型 指针以字节为单位: 指针类型决定了解引用时能访问的空间的大小:也决定了指针的步长(指针+1走多远) 2. 野指针 指针未初始化 指针越界访问 指针指向的空间已释放 int* test() { int a = 10;//野指针 return &a; } int main(){ int* p = test(); //test函数里的a是局部变量,出函数

  • C语言学习之指针知识总结

    目录 一.地址 二.指针与指针变量 三.指针的作用 四.初学指针时常见的错误 五.通过调用函数修改主调函数中的值 六.指针与一维数组 七.使用函数操作一维数组 八.指针变量所占字节数 九.静态数组的缺陷 十.malloc函数 十一.动态数组的构造 十二.静态内存与动态内存的对比 十三.多级指针 十四.跨函数使用内存 一.地址 内存中的最小单元是字节,一个字节对应一个编号,这里的编号就是对应字节的地址.换句话说,地址就是内存单元的编号. 二.指针与指针变量 指针与指针变量是两个不同的概念,指针是某

  • Go语言学习之指针的用法详解

    目录 引言 一.定义结构体 1. 语法格式 2. 示例 二.访问结构体成员 三.结构体作为函数参数 四.结构体指针 总结 引言 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 结构体表示一项记录,比如保存图书馆的书籍记录,每本书有以下属性: Title :标题 Author : 作者 Subject:学科 ID:书籍ID 一.定义结构体 1. 语法格式 结构体定义需要使用 type 和 struc

  • C语言学习之函数知识总结

    目录 前言 一.引入 二.认识函数 三.函数的作用 四.函数的返回值 五.定义函数 六.函数的类型 七.return语句与break语句的区别 八.函数的分类 九.主函数 十.函数使用举例 十一.函数的声明 十二.函数的形参与实参 十三.合理设计函数 十四.变量的作用域 十五.函数内存的分配 前言 函数是C语言的基本单位,学好函数有利于程序的模块化以及避免写出重复的代码从而减少代码量,并且可以提高程序的复用性与可读性. 一.引入 引例:定义6个整型变量a,b,c,d,e,f,并对它们任意赋值.分

  • C语言学习之指针的使用详解

    目录 一.指针概念 1.指针变量 2.指针类型 3.二级指针 二.野指针 1.野指针成因 2.规避野指针 三.指针运算 1.指针±整数 2.指针-指针 3.指针关系运算 四.指针数组 1.指针和数组 2.指针数组的概念 五.字符指针 六.数组指针 七.数组传参和指针传参 1.一维数组传参 2.二维数组传参 3.一级指针传参 4.二级指针传参 八.函数指针 九.函数指针数组 十.回调函数 一.指针概念 在学习指针之前我们先要了解一下内存,内存是存储区域,我们可以把内存划分成一个一个的内存单元,最小

  • R语言学习Rcpp基础知识全面整理

    目录 1. 相关配置和说明 2. 常用数据类型 3. 常用数据类型的建立 4. 常用数据类型元素访问 5. 成员函数 6. 语法糖 6.1 算术和逻辑运算符 6.2. 常用函数 7. STL 7.1. 迭代器 7.2. 算法 7.3. 数据结构 7.3.1. Vectors 7.3.2. Sets 7.3.3. Maps 8. 与R环境的互动 9. 用Rcpp创建R包 10. 输入和输出示例 如何传递数组 通过.attr("dim")设置维数 函数返回一维STL vector 函数返回

  • C语言学习进阶篇之万字详解指针与qsort函数

    目录 前言 函数指针 代码一 代码二 函数指针数组 函数指针数组的用途 计算器的基本代码 函数指针实现简单的计算机 函数指针数组实现简单计算机 指向函数指针数组的指针 回调函数 简单的冒泡排序 冒泡排序的优化 qsort函数 qsort函数介绍 qsort实现冒泡排序 qsort排序结构数据 模拟实现qsort函数 写在最后 前言 前面学到了字符指针,指针数组是一个存储指针的数组,数组指针是一个指向函数的指针,数组参数和指针参数.其中不乏有很多需要注意的知识点,例如:&数组名和数组名表示的含义,

  • Go语言基础学习之指针详解

    目录 1. 什么是指针 2. 指针地址 & 指针类型 3. 指针取值 4. 空指针 5. make 6. new 7. make 和 new 的区别 8. 问题 今天来说说 Go 语言基础中的指针. Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务. 1. 什么是指针 Go 语言中,一个指针变量指向了一个值的内存地址.和 C.C++ 中的指针不同,Go 语言中的指针不能进行计算和偏移操作. Go 语言中的函数传参都是值拷贝,当我们想要修改某个变量的时候,我们可以创建一

  • C语言玩转指针之指针的高阶玩法

    目录 前言 一.字符指针 二.指针数组和数组指针 1.指针数组 2.数组指针 2.1.数组指针是什么? 2.2.&数组名和数组名的区别 2.3.数组指针的使用 三.数组参数与指针参数 1.一维数组参数 2.二维数组参数 3.一级指针传参 4.二级指针传参 四.函数指针 五.函数指针数组 六.指向函数指针数组的指针 七.回调函数 总结 前言 指针第一篇,万人浏览: [C语言]玩转指针--关于指针,你需要掌握的基础知识! 指针的主题,我们在初级阶段的<指针>章节已经接触过了,我们知道了指针

  • Golang语言学习拿捏Go反射示例教程

    目录 1. 反射简介 1.1 反射是什么? 1.2 为什么需要反射? 2. reflect包 2.1 基本反射 2.2 反射与指针 2.3 反射与对象 2.4 反射与函数 2.5 反射例子 3. 总结 1. 反射简介 1.1 反射是什么? Go语言提供了一种机制在运行时更新和检查变量的值.调用变量的方法和变量支持的内在操作,但是在编译时并不知道这些变量的具体类型,这种机制被称为反射.反射也可以让我们将类型本身作为第一类的值类型处理. 反射是指在程序运行期对程序本身进行访问和修改的能力,程序在编译

  • C语言数组和指针,内存之间的关系

    首先论证一维数组和一级指针之前的关系,我们常常使用一级指针指针的方式访问一维数组,只有对内存的理解到位才能理解它们直接的关系. 1.数组名是数组的首地址 2.对数组名取地址得到的还是数组的首地址 3.数组的访问方式其实就是首地址+偏移的寻址访问 我们在程序中会定义很多变量,有基本类型和自定义类型在进行开发的时候我对内存的访问访问就是通过变量名赋值的方式读写内存但是如果你看到的直接变量的符号名你将不可能理解内存.每一种类型都有字节宽度,char 1字节 short 2字节 int 字节float

随机推荐