c语言指针

c语言指针

限于喜欢 提交于 2020-03-12 10:02:56
1. 指针是一种数据类型 如:int * ,char * ,*单目运算符,表示指针上的变量; 2.取变量的地址用& 如int a = 1; int * p = &a 表示把指向a的内存地址赋给 指针变量 p; 3.指针变量可以做左值,也可以做右值 如 int a = 1; int * p = &a; int b = *p; ( 右值) *p = 2; ( 左值 ) 4.数组指针(指向数组中第一个元素的常量指针) 如 int k[] = {0,1,2,3}; (数组变量k本身表达地址) int * p = k; p = k[0] p = &k; 来源: https://www.cnblogs.com/wasoft/p/12467234.html

C指针方面笔试题分享

て烟熏妆下的殇ゞ 提交于 2020-03-12 05:14:44
今天总结分享几个关于C语言指针方面的一些笔试题,主要是对前些日子练习的一些总结,同样也希望看到这篇文章的人,对你能有所帮助。如果有错误的部分,也希望即使指正 笔试题1. `int main(){ int a[5] = { 1, 2, 3, 4, 5 }; int *ptr = (int *)(&a + 1); printf( "%d,%d", *(a + 1), *(ptr - 1)); return 0; }` 程序的运行结果是什么 首先,从这段代码中可以看到定义了一个长度为5的数组a,然后定义了一个指针ptr,将 ptr指向(int*)(&a+1),(&a+1)数组名取地址再加1,是跳过整个数组,指向a[4] 后面的地址,(int*)再将int(*)[5]类型的变量强转为int(*)类型,然后打印 *(a+1),数组名加1,在C语言中a将强制转换为a[0]的地址意味着数组的首元素地址向 后跳过一个元素即为a[1]的地址,在解引用打印数字为2,*(ptr-1)则是将ptr指针向前 跳过sizeof(int)个字节,在解引用,于是打印的结果回事a[4]中的数值,也就是5, 于是此题的答案则为2,5 笔试题2. struct Test { int Num ; char * pcName ; shortsDate ; char cha [ 2 ] ; shortsBa [ 4 ] ;

C语言描述链表的实现及操作

点点圈 提交于 2020-03-11 17:05:39
一.链表的创建操作 // 操作系统 win 8.1 // 编译环境 Visual Stuido 2017 #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef int ElementType; // 定义数据类型,可根据需要进行其他类型定义 // 链表节点的定义 typedef struct ListNode { ElementType Element; // 数据域,存放数据 ListNode* Next; // 指向下一个链表节点 }Node, *PNode; // 链表创建函数定义 PNode CreateList(void) { int len ; // 用于定义链表长度 int val ; // 用于存放节点数值 PNode PHead = (PNode)malloc(sizeof(Node)); // 创建分配一个头节点内存空间//头节点相当于链表的哨兵,不存放数据,指向首节点(第一个节点) if (PHead == NULL) // 判断是否分配成功 { printf("空间分配失败 \n"); exit(-1); } PNode PTail = PHead; // 链表的末尾节点,初始指向头节点 PTail->Next = NULL; // 最后一个节点指针置为空 printf(

你必须知道的指针基础-4.sizeof计算数组长度与strcpy的安全性问题

独自空忆成欢 提交于 2020-03-09 07:23:36
一、使用sizeof计算数组长度 1.1 sizeof的基本使用   如果在作用域内,变量以数组形式声明,则可以使用sizeof求数组大小,下面一段代码展示了如何使用sizeof: int nums[] = {11,22,33,44,55,66}; int i; // sizeof(nums) 计算nums数组的总字节数 // sizeof(int) 计算int类型所占用的字节数 int length = sizeof(nums)/sizeof(int); for(i=0;i<length;i++) { printf("%d ",nums[i]); }   其中sizeof(nums)代表计算nums数组的总字节数,而sizeof(int)则代表计算int类型所占用的字节数(32位系统下是4个字节,64位下可能不同,因此这里使用sizeof(int)可以向程序员屏蔽这个差异),运行结果为: 1.2 sizeof只能在编译时计算   假如我们将上面的代码做一个抽象,将数组的遍历及打印封装为一个方法,代码如下: void printEach(int* nums) { // sizeof(nums)在这里是计算指针的字节数 int length = sizeof(nums)/sizeof(int); printf("The length of nums is %d\n",length);

c语言指针详解

雨燕双飞 提交于 2020-03-09 06:47:55
c语言指针 1.指针是什么? 在c语言中指针和其他变量没有区别,例如 int a 和 int * b,我们可以看做为变量a 与变量b,只是 a存储的是整数值,而b存储的是整数变量的地址!!划重点地址!!! 2.指针的运算 int*a ,float*b,char *c,double*d a++ ,b++,c++, d++, 有什么区别? 已知 int 4字节 float 4个字节 char1个字节 double 8个字节 因为他们占据这些字节,而这些字节体现到内存上, 所以指针 a++ 偏移为4 ,float++偏移 4…依次类推 通过以上的结果我们可以归纳出 ​ 内存的存储长度与内存里面所存储的类型有关!!!划重点 3.指针与一维数组二维数组多维数组 一维数组与指针 int a[9] = {1,2,3,4,5,6,7,8,9}; ①a是什么? a是数组首元素的地址,意思在这个数组中 a代表 首元素1所在的地址 ②a的类型是什么? 因为a是首元素的地址,首元素为int类型,那么a为int *类型 ③a++的含义是什么?有什么用? a++代表往后移动四个字节,至于为啥四个字节呢 因为a是一个地址它存储的是int类型,所以在偏移四个字节后可以访问到a[1] 具体的用处可以用a++,访问数组中的值,可以用a[0] 中括号的方式访问到数组的值 ④写个程序来证明上方是对的 #include

你必须知道的指针基础-6.内存的初始化及结构体的使用

孤者浪人 提交于 2020-03-08 20:58:55
一、内存的使用 1.1 你创建的内存区域可能是脏的   当我们创建一个内存区域的时候,内存中的数据可能是乱七八糟的(可能是其他代码用过后遗留的数据),如下面一段代码: int main(int argc, char *argv[]) { // 下面申请的20个字节的内存有可能被别人用过 char chs[20]; // 这个代码打印出来的可能就是乱码,因为printf的%s是“打印一直遇到'\0'”。 printf("%s\n",chs); return 0; }   其运行结果是如下图所示的乱码,因为printf的%s是“ 打印一直遇到'\0' ”。 1.2 解决脏内存区域的办法   那么,如何解决上面我们有可能会访问的脏内存区域呢?在C语言中,可以采用如下的两种方法:   (1)使用memset函数首先清理一下内存: void *memset(void *s, int ch, unsigned n); 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。   那么,我们可以使用memset函数来清理内存,即填充创建的这块内存区域: int main(int argc, char *argv[]) { // 下面申请的20个字节的内存有可能被别人用过 char

C语言--指针与多维数组的关系

╄→尐↘猪︶ㄣ 提交于 2020-03-08 20:58:34
人之所以痛苦,那是因为你在成长 。--------magic_guo 多维数组,在某种意义上讲,是数组的数组的数组…。 比如二维数组,相当于数组的数组,即在一维数组的基础上,建立的另一个一维数组。 一维数组和指针的关系是:数组名代表数组中首元素的地址,而在多维数组中也是这样。 只不过多维数组的数组名和一维数组的名,值是一样的,但意义不同。 下面的一切都以二维数组为例: 例如: a = {{1, 2, 3, 4}, {5, 6, 7, 8, 9}, {10, 11, 12, 13}} 二维数组的数组名 a 相当于排长,而二维数组中一维数组的数组名{ a[0], a[1], a[2] }相当于班长。 所以当a指向的是二维数组的首元素地址,a[0]也指向二维数组的首元素地址。但是它们两个的站位不同,也就是含义不同。 所以也就不难来理解为什么a[0]+1 和 *(a+0)+1都是&a[0][1]了。 理解了这个关键点,下面来理解另一个定义: 代码: # include <stdio.h> // 一个班三个学生,各学四门学科, 计算总平均分数以及第n个学生的成绩 int main ( void ) { void average ( float * p , int n ) ; void search ( float ( * p ) [ 4 ] , int n ) ; float a [ 3 ]

数组与指针

倾然丶 夕夏残阳落幕 提交于 2020-03-08 20:07:06
1、数组元素的指针    一 个变量有地址,一个数组包含若干元素,每个数组元紫都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某元素的地址放到一个指针变量中)。所谓数组元索的指针就是数组元素的地址。引用数组元素可以用下标法(如a[3]),也可以用指针法,即通过指向数组元素的指针找到所需的元素。使用指针法能使目标程序质量高(占内存少,运行速度快)。 /*定义一个指向数组元素的指针变量的方法*/ int a[10]; //定义a为包含10个整型数据的数组 int *p; //定义p为指向整型变量的指针变量 /*应当注意:如果数组为int型,则指针变量的基类型也为int型,下面对该指针变量赋值*/ p=&a[0]; //把a[0]元素的地址赋给指针变量p /*C语言规定,数组名代表数组中首元素的地址*/ p=&a[0] <=> p=a //等价关系 /*注意数组名a不代表整个数组,上述p=a的作用是把a数组元素的首地址赋给指针变量p,而不是将数组a各元素的值赋给p*/ 2、通过指针引用数组元素    假设p已定义为一个指向整型数据的指针变量,并已给它赋了一个整型数组元素的地址,使它指向某一个数组元素。如果有赋值语句:*p=1; 表示将1赋给ρ当前所指向的数组元素。按C语言的规定:如果指针变量p已指向数组中的一个元素,则p

指针与字符串实例练习

老子叫甜甜 提交于 2020-03-08 20:03:22
在C语言中,字符串是存放在字符数组中的,字符串的引用如下: char string[] ="I love China!";//定义字符数组string printf("%s\n",string);//输出整个字符串 printf("%c\n",string[7]);//输出第七个元素 该字符串长度是14,最后一个字节存放字符串结束符'\0'。 例1:通过字符指针变量输出一个字符串。 1 int main() 2 { 3 char *string="I love China!"; 4 printf("%s\n",string); 5 return 0; 6 } 定义一个char*变量,即字符型指针变量string,用字符串常量"I love China!"初始化,把字符串的第一个元素的地址赋给指针变量string,使string指向字符串的第一个字符。 %s使输出字符串格式符,系统会输出string指向的第一个字符,然后自动使string+1,指向下一个字符,直到'\0'为止。 例2:将字符串a复制为字符串b,然后输出字符串b。 1 int main() 2 { 3 char a[]="I am student.",b[20],*p1,*p2; 4 p1=a;p2=b;//指向数组中第一个元素 5 for(;*p1!='\0';p1++,p2++) 6 *p2=*p1; 7 *p2=

C语言指针

夙愿已清 提交于 2020-03-08 20:00:15
10 指针 指针是C语言中广泛使用的一种数据类型。运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构;能很方便地使用数组和字符串;并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。指针极大地丰富了C语言的功能。学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是我们是否掌握C语言的一个标志。同时,指针也是C语言中最为困难的一部分,在学习中除了要正确理解基本概念,还必须要多编程,上机调试。只要作到这些,指针也是不难掌握的。 10.1 地址指针的基本概念 在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细的介绍。为了正确地访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。 内存单元的指针和内存单元的内容是两个不同的概念。 可以用一个通俗的例子来说明它们之间的关系。我们到银行去存取款时,银行工作人员将根据我们的帐号去找我们的存款单, 找到之后在存单上写入存款、取款的金额。在这里,帐号就是存单的指针, 存款数是存单的内容。对于一个内存单元来说,单元的地址即为指针