题目:
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
代码模板:
int* twoSum(int* nums,int numsSize,int target)
{
}
通过该模板我们可以看出这只是让我们补充其中的一个子函数,该子函数的返回值类型是int类型的指针;其中包含形参nums[]整数数组,数组的长度numsSize和目标值。其中int* nums等价于int nums[].
最简单的方式就是遍历检验
int* twoSum(int* nums, int numsSize, int target) {
int i,j;
int *result = (int*)malloc(2*sizeof(int));
for(i=0;i
关于指针的补充
int* ptr;
指针的类型是int*
指针所指向的类型是int
int p=a;//p的值是a的地址,也就是指针p指向a,p等于a的值
int p=&a;//p引用a的值
&取地址操作
变量a本质是代表一个存储单元,cpu通过该存储单元的地址访问该存储单元中的数据,所以a代表两个值:存储单元的地址和存储单元的数据
a表示a对应的存储单元中的数据
&a表示a对应的存储单元的地址
a表示:(要求a对应的存储单元中的数据一定是另一个存储单元的地址)另一个存储单元中的数据
当a声明的类型是int时,a中存储的是一个存储单元的地址,而该存储单元中存储的数据是一个整数数值,通过*a可以访问这个数值,所以 *p=&p
用scanf输入数据时,存储地址按照顺序递减
#include
main()
{
int a,b,c;
scanf("%d,%d,%d",&a,&b,&c);
printf(" &a=%d\n &b=%d\n &c=%d\n",&a,&b,&c);
}
输入和输出结果如下:
3 4 5
&a=1703740
&b=1703736
&c=1703732
Press any key to continue
指针的进一步理解
这是进一步理解指针的经典案例,即swap()交换函数
#include
void swap(int*,int*);
int main(){
int a=1,b=2;
int*pa,*pb; //定义两个指针类型的变量pa和pb,该指针的类型是int
pa=&a;pb=&b; //pa引用a的地址,pb引用b的地址
swap(pa,pb); //实参是指针变量
return 0;
}
//地址传递是函数传入的参数是地址通常是指向元变量的指针
void swap(int*p1 ,int *p2){
int temp;
temp=*p1; //将p1指向的地址的值赋值给temp
*p1=*p2 ; //p2的值赋值给p1
*p2=temp ;
}
通过调试和测试不同阶段的值的方式来理解该函数
#include
void swap(int*,int*);
int main(){
int a=1,b=2;
int*pa,*pb; //定义两个指针类型的变量pa和pb,该指针的类型是int
pa=&a;pb=&b; //pa引用a的地址,pb引用b的地址
printf("%d,%d\n",&a,&b);
swap(pa,pb); //实参是指针变量
printf("%d,%d\n",&a,&b);
printf("%d,%d\n",a,b);
return 0;
}
//地址传递是函数传入的参数是地址通常是指向元变量的指针
void swap(int*p1 ,int *p2){
int temp;
temp=*p1; //将p1指向的地址的值赋值给temp
printf("%d\n",*p1);
*p1=*p2 ; //p2的值复制给p1
printf("%d\n",*p1);
*p2=temp ;
}
输出
1703740,1703736
1
2
1703740,1703736
2,1
可以看出调用swap()前后a,b的地址并没有发生变化。重点在swap()中,temp是一个整型变量并不是指针类型(这是一个误区点),该函数只是进行值的变换,通过swap()中的两个printf可以清楚的看出来两个*p指向的值是不一样的。