c语言指针

C指针的理解

安稳与你 提交于 2020-02-02 05:02:30
c语言中变量对应汇编立即数寻址,指针对应寄存器寻址,指针的指针对应寄存器间接寻址。用下面这段代码作为例子: test.c: # include <stdio.h> # include <stdlib.h> int main ( int argc , char * * argv ) { int a = 5 ; int * p1 = & a ; int * * p2 = & p1 ; return 0 ; } arm-cortexa9-linux-gnueabihf-gcc -S test.c -emain -fomit-frame-pointer -O0 test.s . arch armv7-a . eabi_attribute 27 , 3 . eabi_attribute 28 , 1 . fpu vfpv3 . eabi_attribute 20 , 1 . eabi_attribute 21 , 1 . eabi_attribute 23 , 3 . eabi_attribute 24 , 1 . eabi_attribute 25 , 1 . eabi_attribute 26 , 2 . eabi_attribute 30 , 6 . eabi_attribute 34 , 1 . eabi_attribute 18 , 4 . file "test.c" . text

int *p、int **p、int (*p)()、int *p()、int *p[n]、int (*p)[n]等简单总结

我怕爱的太早我们不能终老 提交于 2020-02-01 23:41:36
关于指针定义的一些简单归纳和总结。 int *p int *p表示的是一级指针,表示p所指向的地址里面存放的是一个int类型的值。 一级指针存放变量的地址,指向的值是变量的内容。如int* p={1,2,3}, p=数组的首地址,*p=数组的第一个值; 一级指针通过形参,可以修改实参中指针所指向的地址中的值。修改不了实参中指针所指向的地址。需要借助二级指针才可以。 int **p int **p表示的是 二级指针 ,表示p所指向的地址里面存放的是一个指向int类型的指针。 二级指针 存放一级指针的地址,指向一级指针。如int *p ={1,2,3}, int **pp=&p,pp=指针p的首地址,*pp=数组的首地址,**pp=数组第一个值1。 指针数组 的数组名传递参数对应为指针的指针即 二级指针 ,二维数组的数组名传递参数对应为数组指针即指向一维数组的指针 int (*p)() 简单的理解,这就可以理解为调用函数,其中(*p)这个整体可以看作是函数名称,p代表函数的入口地址。很简单的理解吗,c语言中()就代表了函数,所以把 *p用括号括在一起变作 (*p)就代表了一个函数。i int *p() 为了便于理解,可以把这个p换成一个函数的名字 ,比如fun,那么int *fun()代表的是调用这个函数后,这个函数的返回值是一个指针。 int *p[n] int *p[n]

C语言博客05--指针

社会主义新天地 提交于 2020-02-01 20:36:34
1.本章学习总结(2分) 1.1 思维导图 1.2 本章学习体会及代码量学习体会 1.2.1 学习体会 本周学习了指针,都说指针是C语言的灵魂,也是C语言区别于其他语言所独特的地方,学好指针的相关内容十分必要,但同时难度也更大,需要付出更多的时间去理解和熟练掌握。学习到指针部分之后明显感觉有点吃力,虽然也和前面的知识结合紧密,但是需要对指针的概念搞得很清楚,不然就会把地址和该地址所存的内容搞混。然后指针上完之后老师又教了结构体和文件相关的内容,真的要认真学习多花时间才能完全理解掌握。目前的自己觉得还是一直半解,蛮吃力的。 在数据传递时,如果数据块较大,这时就可以使用指针传递地址而不是实际数据,即提高传输速度,又节省大量内存。 指针为动态数据结构(如二叉树、链表)提供支持 1.2.2 代码累计 2.PTA总分(2分) 2.1截图PTA中函数题目集的排名得分 3.PTA实验作业(1分) 3.1 PTA题目1 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。 33.1.1 算法分析 int main() { 定义字符数组 str[500010]; 输入gets(str); 定义长度变量len; len=strlen(str); 定义i,j,count=0; 定义flag=0; for i=len-1 to i>=0 do if str[i]!=' ' then count++

C语言博客05--指针

末鹿安然 提交于 2020-02-01 14:46:01
1.本章学习总结 1.1 思维导图 1.2 本章学习体会及代码量学习体会 1.2.1 学习体会 本章学习了指针的应用,指针是C语言中很有特色的一个东西,其他的语言基本没有这个功能,直接在内存上对变量赋值,同时也学到了很多函数可应用在字符串中运用比如strlen、strcat、 strcmp等等,对数组的大小进行控制也学到了一个新的方法,动态内存分配,可以对数组的大小进行控制,防止像以前那样给数组定义过大的范围,浪费内存。以后也能更好的运用数组。 学完了指针,以后在写程序时需要用函数对变量进行赋值时就不用那么多函数一一进行返回值,可以直接在函数中用指针对函数外面的变量进行修改。 1.2.2 代码累计 2.PTA总分 2.1截图PTA中函数题目集的排名得分 2.2 我的总分:110 3.PTA实验作业 3.1 PTA题目1 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。 3.1.1 算法分析 输入字符串str x=strlen(str); max=x-1; for i=max to 0 then if(字符等于' ') then for j=i+1 to max then 输出下标从i+1到max的字符 输出空格 end for max=i-1; end if end for 3.1.2 代码截图 3.1.4 PTA提交列表及说明 Q1:刚开始段错误因为数组的范围不够

c程序设计错题集

自作多情 提交于 2020-02-01 10:26:47
错题集 数组: 1.数组定义中,数组名后是用方括号括起来的常量表达式,不能用圆括号。(正确) 解析:数组标准样式array[ ],不能用array(); 2.函数strcmp从头至尾顺序地将其对应字符比较,遇到两个字符不等时,两个字符相减得到一个int型值,两个字符串完全相同时,则返回0。 (正确) 解析:用strcmp函数时头文件用#include<string.h> 在字符串比较时 如果相等时 返回int值0 如果字符串1>字符串2,则返回正整数 反之返回负整数。 3 .数组定义后,只能引用单个的数组元素,而不能一次引用整个数组。 (正确) 解析:数组只能用循环输出, 但是字符串数组可以用%s输出 4 .若有定义int a[]={2,4,6,8,10},a[1]和a++表示的含义相同。 (错误) 解析:a为数组名,数组名不能自增。 程序填空题: 1.选择法排序:本题要求将给定的nnn个整数从小到大排序后输出。输出时相邻数字中间用一个空格分开,行末不得有多余空格。 #include <stdio.h> #define MAXN 10 int main() { int i, index, k, n, temp; int a[MAXN]; scanf("%d", &n); for(i = 0; i < n; i++){ scanf("%d", &a[i]); } for(k = 0;

C语言之结构体

喜你入骨 提交于 2020-02-01 03:56:21
概念 结构体是一种构造类型,由若干个成员组成,成员可以是基本数据类型,或是另一个结构体 声明结构体 struct 结构体名 { 成员列表 }; 结构体名表示结构的类型名。 声明一个结构体表示创建一种新的类型名(自定义数据类型),然后用类型名定义变量。 struct Product { char name[10]; char shape[10]; char color[10]; float price; } 使用结构体定义变量有三种方式 第一种:声明结构体类型,再定义变量 struct Product p1; struct Product p2; p1和p2是结构体变量名,这两个变量具有相同的结构 类比: 类型名 变量名 int a; | | struct Product p; struct Product整体表示一种数据类型 定义结构体变量后,系统会为其分配内存单元 第二种:声明结构体类型时,同时定义变量(可以定义多个变量) struct 结构体名 { 成员列表 } 变量名列表; example: struct Product { char name[10]; char shape[10]; char color[10]; float price; } p1, p2; 第三种:直接定义结构体类型变量(匿名结构体,没有结构体名称) struct { 成员列表 } 成员变量;

指针、数组与sizeof运算符

那年仲夏 提交于 2020-02-01 01:51:37
1、sizeof是C语言的一个运算符(主要sizeof不是函数,虽然用法很像函数),sizeof的作用是用来返回()里边 的变量或者数据类型占用的内存字节数。 2、sizeof存在的价值: 主要是因为在不同平台下各种数据类型所占的内存字节数不尽相同(譬如int在32位系统上为4字节,在16位系统上 为2字节)。所以程序中需要使用sizeof来判断当前变量/数据类型在当前环境下占几个字节。 3、举例说明: 例子1:char str[] = "hello"; sizeof(str) //元素所占的字节数,也就是数组的大小 占6个字节 sizeof(str[0]) //第0个元素,第0个元素是char型的,所以 占1个字节 sizeof(str) //字符串的长度(不包含最后的\0), 占5个字节 例子2:char str[] = "hello"; char *p = str;//str做右值,相当于首元素的首地址,数组的元素是char型, //那么str就是char *,刚好匹配 sizeof(p) //p本身是一个指针变量,跟p指向的变量一点关系没有;只是一个char *指针的长度, //32位系统上所有的指针的长度都是4 sizeof(*p) //p所指向的变量,p所指向的变量是char型的,相当于sizeof(char) 自然是1 strlen(p) //相当于strlen

c++复合类型

别等时光非礼了梦想. 提交于 2020-02-01 01:04:24
1.数组 数组存储同类型的值; 数组使用下标或索引对元素进行标号,从0开始编号; 只能在定义数组时才能使用初始化,此后就不可以了,也不能将一个数组赋给另一个数组; 初始化数组时,提供的值可以少于数组元素的值。如果只对数组的一部分初始化,则编译器将把其他元素设置为0。因此,将数组中所有元素都初始化为0非常简单——只需显式地将第一个元素初始化为0,然后让编译器将其他元素都初始化为0即可:long totals[500] = {0}. 2.字符串   要将字符串存储到数组中,最常用的方法有两种——将数组初始化为字符串常量、将键盘或文件输入读入到数组中。 3.string类 可以使用c-风格字符串来初始化string对象; 可以使用cin来将键盘输入存储到string对象中; 可以使用cout来显示string对象; 可以使用数组表示法来访问存储在string对象中的字符。   c风格的字符串是用数组存放的,一般要以'\0'结束而c++主要以 string类 代替,更加高效,且不易出错   例如:string str = "123";就是c++的风格;char str[4]="123";就是c风格。string是c++中的关键字,和int,float等等一样, 在c++中,string 定义的变量可以直接存储字符串。在C语言中是没有这种直接存储字符串的变量的。   [ ]里面是4,是因为

C语言开发面试题

六月ゝ 毕业季﹏ 提交于 2020-01-31 11:40:41
 (以下是题主参加的一家偏向Linux平台开发的公司软件岗位笔试题,分享原题,后面附上题主91分的部分参考答案^V^) 一、(8分)请问一下程序输出什么结果? char *getStr(void) {   char p[] = "hellow world";   return p; } void test(void) {   char *str = NULL;   str = getStr();   printf(str); } 二、(5分)test2函数有问题吗,如果有,请支出问题出在什么地方并给出正确答案。 void test2() {   char string[10], str[10];   int i;   for(i = 0; i < 10; i++)   {     str[i] = 'a';   }   strcpy(string, str); } 三、(5分)用预处理指令#define 声明一个常数,用以表明一年中有多少秒。(忽略闰年问题) 四、(5分)写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。 五、(8分)你怎么样用C编写死循环呢? 六、(10分)用变量a给出下面的定义: 1、一个整型数; 2、一个指向整型数的指针; 3、一个指向指针的指针,它指向的指针是指向一个整型数; 4、一个有10个整型数的数组; 5、一个有10个指针的数组

C语言趣味题目

江枫思渺然 提交于 2020-01-31 11:39:55
http://sunxiunan.com/?p=1647 在这个网站上 http://stevenkobes.com/ctest.html 发现一套很有趣的C语言测试题,如果你招聘C语言相关开发人员,或者正在学习C语言,很值得参考。 如果没有做,下面内容暂时不要看,最好自己先完成一遍。 —————————————– OK,假设你做的答案没有完全正确,那你可以继续看下去了,否则,后面内容对你来说就是小菜一碟,不值得看。 ——————————————– 第一题: #include <setjmp.h> static jmp_buf buf; int main(void) { volatile int b = 3; if (setjmp(buf) != 0) { printf(“%d\n”, b); exit(0); } b = 5; longjmp(buf, 1); } 输出结果为A)3 B)5 C)0 D)都不是 答案为B,也就是输出5。 关键点在于理解setjmp以及longjmp,( http://en.wikipedia.org/wiki/Setjmp.h )第一次运行到setjmp,会设置jmp_buf,然后返回0。当调用longjmp时,会把longjmp里面的非0值作为setjmp的返回值返回(如果longjmp的value参数为0,setjmp恢复后返回1