指针数组

c++ 指针(一)

依然范特西╮ 提交于 2020-01-18 19:02:31
指针 每一个变量都有一个内存位置 ,每一个内存位置都定义了可使用连字号( & )运算符访问的地址,它 表示了在内存中的一个地址 #include <iostream> using namespace std; int main () { int var1; char var2[10]; cout << "var1 变量的地址: "; cout << &var1 << endl; cout << "var2 变量的地址: "; cout << &var2 << endl; return 0; } 结果: var1 变量的地址: 0xbfebd5c0 var2 变量的地址: 0xbfebd5b6 一、定义 指针是一个变量,其值为另一个变量的地址 ,即, 内存位置的直接地址 。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。 type *var-name; 星号是用来指定一个变量是指针 int *ip; /* 一个整型的指针 */ double *dp; /* 一个 double 型的指针 */ float *fp; /* 一个浮点型的指针 */ char *ch; /* 一个字符型的指针 */ 所有 指针的值的实际数据类型 ,不管是整型、浮点型、字符型,还是其他的数据类型, 都是一样的,都是一个代表内存地址的长的十六进制数 。

一些常用的算法技巧总结

柔情痞子 提交于 2020-01-18 07:57:09
1. 巧用数组下标 数组的下标是一个隐含的很有用的数组,特别是在统计一些数字,或者判断一些整型数是否出现过的时候。例如,给你一串字母,让你判断这些字母出现的次数时,我们就可以把这些字母作为 下标 ,在遍历的时候,如果字母a遍历到,则arr[a]就可以加1了,即 arr[a]++; 通过这种巧用下标的方法,我们不需要逐个字母去判断。 我再举个例子: 问题: 给你n个无序的int整型数组arr,并且这些整数的取值范围都在0-20之间,要你在 O(n) 的时间复杂度中把这 n 个数按照从小到大的顺序打印出来。 对于这道题,如果你是先把这 n 个数先排序,再打印,是不可能O(n)的时间打印出来的。但是数值范围在 0-20。我们就可以巧用数组下标了。把对应的数值作为数组下标,如果这个数出现过,则对应的数组加1。 代码如下: public void f(int arr[]) { int[] temp = new int[21]; for (int i = 0; i < arr.length; i++) { temp[arr[i]]++; } //顺序打印 for (int i = 0; i < 21; i++) { for (int j = 0; j < temp[i]; j++) { System.out.println(i); } } } 提醒:可以左右滑动 利用数组下标的应用还有很多

错题集

吃可爱长大的小学妹 提交于 2020-01-17 05:28:56
1.函数strcmp从头至尾顺序地将其对应字符比较,遇到两个字符不等时,两个字符相减得到一个int型值,两个字符串完全相同时,则返回0。 对。我的理解产生了错误。误以为返回值的是ascii码的大小。事实上int大于0则是1,小于则是-1。 2.数组名就是一个指针常量,指向数组的首元素(或者说代表了数组的首地址)。 错。数组名是地址,不是指针常量,它的值可以赋给指针。 3.有说明语句int a[4][5];,则a[2]+3表示 ( A) 。 A.a数组行下标为2、列下标为3的元素的地址 B.0a数组行下标为2、列下标为3的元素的值 C.a数组第2行的首地址 D.a数组第3行的首地址 a[2]表示地址。+3表示地址后移3个元素。 4.语句int *p; *p=50;执行时,不会有任何错误。 错。在执行时,*P没有值。printf不出来任何值。 5.对于以下结构定义,++p->str中的++加在 ( A) 。 struct { int len; char *str; } *p; A.指针str上 B.指针p上 C.str指的内容上 D.以上均不是 因为p->str是对指针str的引用。 6.在一个以 h 为头的单向链表中,p 指针指向链尾的条件是(A)。 A.p->next=h B.p->next=NULL C.p->next->next=h D.p->.data=-1 p

转载

社会主义新天地 提交于 2020-01-17 05:21:14
转载 :http://www.cnblogs.com/lxshanye/archive/2013/05/20/3088558.html 1.变长一维数组 这里说的变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组。实现变长数组最简单的是变长一维数组,你可以这样做: 1: //文件名: array01.cpp 2: #include<iostream> 3: using namespace std; 4: int main() 5: { 6: int len; 7: cin>>len; 8: //用指针p指向new动态分配的长度为len*sizeof(int)的内存空间 9: int *p=new int[len]; 10: ........... 11: delete[] p; 12: return 0; 13: } 注意int *p=new int[len];这一句,你不能这样做: int p[len]; C++编译器会报错说len的大小不能确定,因为用这种形式声明数组,数组的大小需要在编译时确定。而且这样也不行: int p[]=new int[len]; 编译器会说不能把int*型转化为int[]型,因为用new开辟了一段内存空间后会返回这段内存的首地址,所以要把这个地址赋给一个指针,所以要用int *p=new int[len]; array01

函数指针 —— 《C和指针》

断了今生、忘了曾经 提交于 2020-01-17 03:59:39
函数指针 函数指针是指向函数的指针。 因此“函数指针”本身首先是指针变量,只不过该指针变量指向函数。 声明 返回值类型 ( *指针变量名) (形参列表); int (*pfunc)(int x); int (*pfunc)(int); //无需将形参名给出 初始化 和普通指针一样,函数指针在使用之前必须初始化为指向某个函数。 int func(int x); //被指向的函数 pfunc = func; //初始化函数指针pfunc,使其指向函数func pfunc = &func; //也是正确的 int (*pfunc)(int) = func; //也可以直接在声明时进行初始化 注意:在函数指针初始化之前需要有被指向函数func的原型,否则编译器就无法检查func的类型是否和pfunc所指向的类型一致。 使用: int ans; ans = func(5); ans = pfunc(5); ans = (*pfunc)(5); //也是正确的,但间接访问操作是不必要的 注意:在初始化赋值语句中的操作符 & 和调用函数指针时的 * 操作符都是可选的: 1. 函数名被使用时总是由编译器把它转换为函数指针。 & 只是显示地说明了编译器将隐式执行的任务。 2. * pfunc把函数指针pfunc转换为一个函数名,编译器在执行函数调用之前又会把它转换回去。因此这个转换是不必要的。

嵌入式面试题(C/C++)

故事扮演 提交于 2020-01-15 11:38:27
目录 概念区分 编程 概念区分 变量的声明和定义有什么区别 为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,但只能在一个地方定义。加入 extern 修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。 说明:很多时候一个变量,只是声明,不分配内存空间,知道具体使用时才初始化,分配内存空间,如外部变量。 sizeof和strlen的区别 sizeof 是一个操作符 ( 关键词 ) ,strlen是库函数。 sizeof 的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为‘\ 0 ‘的字符串作参数。 编译器在编译时就计算出了 sizeof 的结果。而strlen函数必须在运行时才能计算出来。 sizeof 计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度。 写一个“标准”宏MIN # define min(a,b) ((a)<=(b)?(a):(b)) //加圆括号,保护数据 一个指针可以是volatile吗? 可以,因为指针和普通变量一样,有时也有变化程序的不可控性。常见例:子中断服务子程序修改一个指向一个buffer的指针时,必须用 volatile 来修饰这个指针。 a 和 &a 有什么区别请写出以下代码的打印结果,主要目的是考察a和&a的区别。 # include <stdio.h> int

c语言 指针数组

╄→гoц情女王★ 提交于 2020-01-15 04:46:49
指针数组 指针数组是数组,指针数组每个元素是一个指针 指针数组的定义:type* parray[n]; type* 是数组中每个元素的类型 parray 为数组名 n为大小 例子: float* a[3] //a是一个数组,每个元素的类型是float* code: #include <stdio.h> #include <string.h> #define DIM(a) (sizeof(a)/sizeof(*a)) int lookup_keyword(const char* key, const char* table[], const int size) { int ret = -1; int i = 0; for(i=0; i<size; i++) { if( strcmp(key, table[i]) == 0 ) { ret = i; break; } } return ret; } int main() { const char* keyword[] = { "do", "for", "if", "register", "return", "switch", "while", "case", "static" }; printf("%d\n", lookup_keyword("return", keyword, DIM(keyword))); printf("%d\n"

空指针异常

家住魔仙堡 提交于 2020-01-15 04:39:08
在使用变量引用一个数组时,变量必须指向一个有效的数组对象,如果该变量的值为null,则意味着没有指向任何数组,此时通过该变量访问数组的元素会出现空指针异常,接下来通过一个案例来演示这种异常,如下所示。 ArrayDemo07.java public class ArrayDemo07 { public static void main(String[] args) { int [] arr = new int [3]; // 定义一个长度为3 的数组 arr[0] = 5; // 为数组的第一个元素赋值 System. out .println( "arr[0]=" + arr[0]); // 访问数组的元素 arr = null ; // 将变量 arr 置为 null System. out .println( "arr[0]=" + arr [0]); // 访问数组的元素 } } 运行结果如下图所示: 通过上图所示的运行结果可以看出,上述代码中第4、5行代码都能通过变量arr正常地操作数组。第6行代码将变量置为null,当第7行代码再次访问数组时就出现了空指针异常NullPointerException。 来源: CSDN 作者: little-stars 链接: https://blog.csdn.net/weixin_41874888/article/details

数组指针、指向函数指针数组的指针与 typedef 的用途

☆樱花仙子☆ 提交于 2020-01-14 20:05:50
目录 一、对指针的认识 二、转载“浅谈 数组指针 指针数组 函数指针 函数指针数组... 以及它们之间区别。” 三、转载“typedef” 一、对指针的认识 指针仅仅是一个变量,变量名是由字母数字下划线组成的一个字符串,其他的 * () [] 等均不是指针变量名的一部分,而是表明指针指向的类型,是对指针的约束,表明该指针只能指向某种类型的数据。 典型例子如: // 变量定义一 void (*p)(int, char*); // 变量定义二 typedef void (*pFunc)(int, char*); pFunc p; 变量定义一 定义了一个指向 “ ①有两个参数且参数类型分别为int和char* ②函数的返回值类型为void 的函数” 的指针变量,变量名为 p 变量定义二 先把上述数据类型声明为 pFunc,然后用 pFunc 定义一个变量 p 这两种定义方法是等价的。 下面转载两篇对认识指针很有帮助的两篇文章。 二、转载“浅谈 数组指针 指针数组 函数指针 函数指针数组... 以及它们之间区别。”作者 tp_16b 阅读目录 数组指针 指针数组 函数指针 函数指针数组 指向函数指针数组的指针 【写在前面】 首先,先说明一个关系: 数组和指针是没关系的! 数组名和指针的概念 区别 :   数组名和指针虽都代表数组首元素的地址,但 意义不同。   网上有个举得比较好的例子

实验12 指针与数组

佐手、 提交于 2020-01-14 07:08:14
文章目录 6-1 计算两数的和与差 (15分) 6-2 使用函数的选择法排序 (15分) 6-3 在数组中查找指定元素 (30分) 6-4 冒泡排序 (15分) 7-1 组织星期信息 (25分) 6-1 计算两数的和与差 (15分) 本题要求实现一个计算输入的两数的和与差的简单函数。 函数接口定义: void sum_diff( float op1, float op2, float *psum, float *pdiff ); 其中op1和op2是输入的两个实数, psum和 pdiff是计算得出的和与差。 裁判测试程序样例: #include <stdio.h> void sum_diff( float op1, float op2, float *psum, float *pdiff ); int main() { float a, b, sum, diff; scanf("%f %f", &a, &b); sum_diff(a, b, &sum, &diff); printf("The sum is %.2f\nThe diff is %.2f\n", sum, diff); return 0; } /* 你的代码将被嵌在这里 */ 输入样例: 4 6 输出样例: The sum is 10.00 The diff is -2.00 void sum_diff (