首页
学习
活动
专区
圈层
工具
发布

C语言——指针(2)

2.&数组名,这里的数组名表示整个数组,取出整个数组的地址。整个数组的地址和数组首元素地址是完全不一样的。 除去上面的特殊情况,其他地方使用数组名,都是首元素地址。...答案是不能,上面已经提到了,你创建的用来接收数组名的形参本质上是个指针,指针的大小只与环境有关(X64下是8个字节,X86是4个字节)。 所以在函数内部是计算不出数组的大小的。...三.二级指针 指针变量是变量,既然是变量,那就是地址。 我们用二级指针来接收一级指针变量的地址。...,有关二级指针的运算,我们可以通过*p2,也就是对p2进行解引用找到p1,再对p1解引用找到n,从而对n进行修改。 四.指针数组 指针数组就是存放指针的数组。...指针数组容易与数组指针混淆,前者是数组,后者是指向数组的指针。 那么指针数组有什么用吗? 下面我们就用指针数组来模拟二维数组: 关于指针的第二篇写完了,有缘再会,拜拜。 摸鱼摸鱼✨

10610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C语言(指针)2

    3、指针变量类型的意义 既然指针变量的大小与类型没有关系,那为什么还要有不同的指针类型呢? 在某些情况下,指针类型还是有很大意义的。...3.1指针的解引用 这里来举一个例子探讨指针变量类型的意义。...因为,指针类型决定了对指针解引用的时候有多大的权限,也就是一次能操作几个字节。这就是指针变量类型的意义。...3.2指针+-整数 观察下面的代码: 跟我们想的一样,&a、pa、pc的值是一样的,但当我们给&a、pa、pc加一个整数1的时候得到了不一样的结果,通过观察,&a和pa...3.3void *类型 在指针类型中有一种特殊的类型是 void * 类型的,为无具体类型的指针(泛型指针),这种类型的指针可以用来接收任意类型的地址。

    13910

    C语言指针加 1 引发的思考

    问题背景 最近有小伙伴对于 C 语言中指针的运算有点疑问:指针变量加 1 之后,到底向后偏移了几个字节呢?...理解指针 指针定义 每个指针都对应一个类型。这个类型表明该指针指向的是哪一类对象。指针的类型不是机器码中的一部分,而是C语言提供的一种抽象,帮助程序员避免寻址错误。 每个指针都有一个值。...NULL 指针 C语言标准中定义了 NULL 指针,作为一种特殊的指针变量,其指向的内容为空(即不指向任何东西)。将其赋值给某个指针变量,表示该指针目前并未指向任何东西。...指针转换 通过类型转换,可以将指针从一种类型转换为另一种形式,改变的只是它的类型,值是不会改变的。 C语言中的类型转换有两种:隐式类型转换和强制类型转换。...指针运算 C语言的指针运算有两种形式。 第一种:指针 ± 整数 这种计算出来的值,会根据该指针指向的某种数据类型的大小进行伸缩。

    1.6K20

    初识C语言·指针(2)

    int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int* p1 = arr; int* p2 = &arr[0]; printf("%p...2 指针访问数组 有了前面知识的铺垫,我们就可以通过指针来访问数组了。比如实现输入,实现打印等操作。...5 二级指针 我们说一个变量,在内存中存储的时候就会有自己的“房间”,有自己的“门牌号”,那么指针变量也是变量,它也会有自己的地址,我们用另一个指针变量来存储这个指针变量,新的存储指针变量的指针变量就被称为二级指针...这里来一段代码过过瘾就行 int main() { int num = 10; const int* const p1 = # int** p2 = &p1; **p2 = 20; printf...#include int main() { int arr1[] = {1,2,3,4,5}; int arr2[] = {2,3,4,5,6}; int arr3[] = {

    6310

    C语言-------指针进阶(2)

    指针数组,数组里面的元素都是int*的指针类型; 2.数组指针 数组指针是什么,如何使用,我们回忆一下二维数组传参,我们知道一维数组的传参,例test函数 test(arr)参数arr是数组名,就是数组首个元素的地址...,有5个元素,我们使用数组指针 int(*p)[5]进行接收,这个数组指针表示指向5个元素,每个元素的类型是int类型,数组指针的名字 是p指针,指针类型int(*)[5],指针的类型决定了对指针进行加一操作会跳过几个字节...,如果是普通的 整形指针数组,加一就跳过4个字节,但是这里的p指针的类型是int(*)p,所以加一会跳过5个元素, 也就是20字节。...int,int)就是定义函数指针,这个函数指针的参数有2个,都是int类型 这个函数的返回类型是int类型,实际上在进行调用的时候,加上星号只是为了表示他是函数指针 加上2个或者多个星号都不影响使用,不加星号都是可以的...int(*ptr)[5] ptr也是一种类型了,平时的int(*p2)[5]=&arr(这里的p2就是指针变量)就可以写为ptr p2=&arr, 函数指针类型重命名,原来的 void (*pf)(int

    8500

    C语言---深入指针(2)

    单只数组首元素的地址+1跳过的是4个字节 //所以我们&arr,&数组名的时候,取出的就是整个数组的地址 return 0; } //以后在做题的时候一定要看看前面有没有sizeof或者前面加没加取地址符号...=sz-1-1=8,所以这个循环的条件一定是sz-1-i //随着i的变化,这个内循环的趟输也要改变 { count++;//一组数字进行比就加一...在C语言中,int*arr[5] 声明了一个包含5个元素的数组,每个元素都是一个指向int类型数据的指针。这个数组可以存储指向整数的指针,可以是指向整数变量的指针,也可以是指向整数数组的指针。...int类型的指针 在这个例子中,arr数组的前三个元素分别指向变量num1、num2和num3的地址。...int*arr[5] 还可以用于指向整数数组的指针,例如: int array1[3] = {1, 2, 3}; int array2[3] = {4, 5, 6}; int* arr[2] = {

    12410

    C语言之指针详解(2)

    经过了上一讲的《C语言之指针详解(1)》的学习后,我想大家对于指针已经有了一定程度的了解,这章我们将继续学习C语言。这章主要讲的是 数组与指针之间的一些联系。...总结:数组名是数组首元素的地址,但是有2个例外。 二、使用指针访问数组 有了前面知识的支持,再结合数组的特点,我们就可以很方便的使用指针访问数组了。...{ printf("%zd\n", sizeof(arr));//计算⼀个指针变量的⼤⼩ } int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }...四、二级指针 指针变量是用来存放地址的,但它也是变量,是变量就有地址,那么指针变量的地址放在哪里? 这就是二级指针。...六、指针数组模拟二维数组 #include int main() { int arr1[] = { 1,2,3,4,5 }; int arr2[] = { 2,3,4,5,6 }

    8310

    C语言进阶指针(2)(超详细)

    三、一维数组传参的本质 数组传参时,我们常能看到两种写法, 1.void Print(int*arr); 2.void Print(int arr[10]); 其实对于这两种写法,传过去的都是指针变量...这次我们这是先认识一下二级指针,以后我们会对二级指针有一个更加深入的讲解。 当然还有三级指针。 五、指针数组模拟二维数组 指针数组是指针还是数组呢? 整形数组-存放整形的数组。...//指针数组模拟二维数组 int main() { int arr1[] = { 1,2,3,4,5 }; int arr2[] = { 2,3,4,5,6 }; int arr3[] = { 3,4,5,6,7...}; int* arr[3] = { arr1,arr2,arr3 }; int i = 0; int j = 0; for (i = 0; i < 3; i++) { for (j =...j++) { printf("%d ", arr[i][j]); } printf("\n"); } return 0; } 1.arr的第一个数组里放arr1的首元素地址 2.

    9610

    C语言:指针2(超详细讲解)

    }; printf("%d", sizeof(arr)); } 看看下面这个代码我们可以看到&arr和&arr[0]拿到的是数组首元素地址, 但是&arr+1的话是加40个字节,也就是整个数组 &arr...[0]+1是加4个字节 int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; printf("&arr = %p\n", &arr); printf...2个数值进行交换 最后就是打印了 指针数组 指针就是存放指针的数组 当我们需要创建很多个指针,总不能一个一个创建吧 我们就需要创建个指针数组把这些指针放进去就行了 下面这个就是把a,b,c的指针放到指针数组里...然后循环通过i访问下标把这3个值改成99,然后打印 当然指针数组里每个地址都是int*类型的,也可以说是指针 指针数组模拟二维数组 我们通过 i 来访问arr1,arr2,arr3 j是访问这些数组的每个元素...int main() { int arr1[5] = {1,2,3,4,5}; int arr2[5] = {2,3,4,5,6}; int arr3[5] = {3,4,5,6,7}; int

    10210

    C语言:深入理解指针(2)

    我发现在x64环境下sz2等于2,而在x86环境下sz2=1,这说明传入的arr虽然是首元素的地址,其本质是一个指针,大小是一个指针的大小,而指针取决于操作平台,x64是8个字节,x86是4个字节。      ...sizeof 运算符的返回值,C 语言只规定是无符号整数,并没有规定具体的类型,而是留给系统自己去决定, sizeof 到底返回什么类型。...C 语⾔提供了⼀个解决⽅法,创造了⼀个类型别名 size_t ,⽤来统⼀表⽰ sizeof 的返回值类型。...7.2 strlen      strlen是C语言的库函数,头文件是,功能是求字符串的长度。        ...{ char arr1[3] = { 'a','b','c' }; char arr2[] = "abc"; char arr3[20] = "abcdef"; char arr4[6] = "

    16710

    C语言学习——指针精华(2)

    C++....= '\0'; i++) printf("%c", a[i]); printf("\n"); return 0; } 结果如下: 用指针变量指向的格式字符串代替printf中的格式字符串...本身占4字节; (2)函数指针、数组指针、普通指针之间并没有本质区别,区别在于指针指向的内容是什么; (3)函数的实质是一段代码,这一段代码在内存中是连续分布的(一个函数的大括号括起来的所有语句将来编译出来生成的可执行程序是连续的...),所以对于函数来说很关键的就是函数中的第一句代码的地址,这个地址就是所谓的函数地址,在C语言中用函数名这个符号来表示; (4)结合函数的实质,函数指针其实就是一个普通变量,这个普通变量的类型是函数指针变量类型...- 1]; } 结果如下: 【工程案例】 #include int main() { int x = 89; int y = 92; int *p[2]

    33820

    【C语言】指针(野指针)

    2:如何规避野指针 1.1:指针变量的初始化 2.2:指针越界访问 3.3:指针指向的空间如果我们还回去的话,就把指针指针置为NULL  4.4:指针使用之前检查有效性 1:什么是野指针?...指针越界也会导致野指针问题,这里解释下:就是当你指针指向的范围超过数组名范围时,那么那个指针就是野指针了。...2:如何规避野指针 1.1:指针变量的初始化 int a = 10; int* pa = &a; //指针变量的初始化 指针常见错误 引用未初始化的指针变量 试图引用未初始化的指针变量是初学者最容易犯的错误...3.3:指针指向的空间如果我们还回去的话,就把指针指针置为NULL NULL——空指针,用来初始化指针或者给指针赋值,可以转到定义看看 #define NULL    ((void *)0) 说的简单一点就是...空指针不应与未初始化的指针混淆:保证空指针与指向有效对象的任何指针进行比较。但是,根据语言和实现,未初始化的指针可能没有任何此类保证。它可能与其他有效指针相等; 或者它可能比较等于空指针。

    2.9K20

    C语言——指针

    指针是什么? 指针是什么? 指针理解的 2 个要点: 1. 指针是内存中一个最小单元的编号,也就是地址 2....每个地址标识一个字节,那我们就可以给 ( 2^32Byte == 2^32/1024KB == 2^32/1024/1024MB==2^32/1024/1024/1024GB == 4GB) 4G...指针的大小在 32 位平台是 4 个字节,在 64 位平台是 8 个字节 2. 指针和指针类型 这里我们在讨论一下:指针的类型 我们都知道,变量有不同的类型,整形,浮点型等。...指针未初始化 #include int main() { int *p;//局部变量指针未初始化,默认为随机值 *p = 20; return 0; } 2....指针指向的空间释放 这里放在动态内存开辟的时候讲解,这里可以简单提示一下 3.2 如何规避野指针 1. 指针初始化 2. 小心指针越界 3.

    37110

    C - 指针C语言指针的总结

    C语言指针的总结 1. 变量 不同类型的变量在内存中占据不同的字节空间。 内存中存储数据的最小基本单位是字节,每一个字节都有一个内存地址,这个地址是一个十六进制的数。...什么是指针:变量的地址叫做指针,指针就是地址,地址就是指针。 下面通过一张图可以更直观的理解内存中的地址 ? 内存中的地址演示图 2. 指针 指针是C语言的灵魂。指针变量占据8个字节。...*p = 100; 表示将100赋值给p指针指向的变量,也就是num变量 使用指针变量的时候注意点 int* p1 ,p2, p3 ; 此时p1是int *指针,而p2,p3是int类型数据 如果希望全部都是指针需要...",num1); printf("num2 = %d",num2); return 0; } 指针为什么要分类型 指针变量既然是一个变量就要在内存中占用字节空间 指针变量在内存中占据多少字节数...指针与整数的加减法 指针可以和整数进行加减运算,指针+1并不是在指针地址的基础之上加一个字节的地址,而是在这个指针地址的基础之上加一个单位变量占用的字节数,例如:如果指针类型是int * 则+1代表加

    4.5K81

    【C语言】指针

    二、指针的定义 三、指针的初始化 四、指针运算符 五、指针的用途举例 六、关于指针的疑问 指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很好,那你干脆说没学过C语言。...1.我们已经知道,"直接引用"是直接通过变量名来读写变量 2.C语言中还有一种"间接引用"的方式(以变量a为例):首先将变量a的地址存放在另一个变量中,比如存放在变量b中,然后通过变量b来间接引用变量a...* 看下面的代码,利用指针p读取变量c的值 1 int i = 2; 2 char c = 1; 3 4 // 定义一个指向char类型的指针 5 char *p = &c; 6 7 // 取出 8...这个要根据内存来分析 根据变量的定义顺序,这些变量在内存中大致如下图排布: 其中,指针变量p和int类型变量i各占2个字节,char类型的c占一个字节,p指向c,因此p值就是c的地址 ?...当利用*p来获取变量c的值时,由于指针p知道变量c是char类型的,所以会从ffc3这个地址开始读取1个字节的数据:0000 0001,转为10进制就是1 2> 后来,我们用int *p指向变量c。

    3.6K60
    领券