指针(笔记)

来源:互联网 发布:adobe软件如何下载 编辑:程序博客网 时间:2024/06/05 12:07

指针

上午:
内存和外存的区别:内存里的东西是暂时的,断电后消失;外存(硬盘)里的东西是可以储存起来的,断电后不容易消失。
学习方法:画内存图;去星;
指针传递地址中的值;
一次函数调用返回两种结果,用指针是一种方法;另外一种是结构体方法。
例子:

void student(int *height,double *score){

    *height+=10;

    *score+=10;

}

int main(int argc, const char argv[])

{

    @autoreleasepool {

 int h=180;//给变量height赋值

        double s=90;//给变量score赋值

        student(&h,&s);//调用student(int*height,double*score)

        printf("%d,%lf\n",h,s);//一次函数调用,返回不同的效果

           }

    return 0;

}


指针只有在具体的数据类型数组结构中才能进行运算,同一个数组内。

*p++; *(p++); *(p+n);//指针加减运算只是基于数组结构的,出了这个结构就是错误的。

两个指针类型做加法是没有意义的。减法表示的是两个指针内存之间的间隔。

int *p=arr;

用数组名做指针的时候可以写成*(arr+i);    但不能写成*(arr++)会抛错:cannot increment value of type "int [5]"

 arr作为数组起始位置的开始,十个常量,不能变的,不可修改。


random为假随机,arc4random为真随机,能获取到0~2的32此方-1的数。


下午:二位数组:面试的时候容易遇到

int arr[3][4] {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 

arr储存的是二维数组中首行首列元素的地址;{1,2,3,4}

int (*p)[4]=arr;        arr[0]不是具体某个元素,而是一个地址。

1、例子:答案选D

若有以下定义,

int a[3][4]={{0,1},{2,4},{5,8}},(*p)[4]=a;

则数组为4的表达式是()(选择一项)

a) *a[1]+1

b) p++,*(p+1)

c) a[2][2]

d) p[1][1]


2.答案选D

设有变量定义语句"int a[2][3];",能正确表示数组a中元素

地址的表达式是() (选一项)

a) a[1]+3 

b) *(a+2)

c) *(a[1]+2)

d) *(a+1)


3、下列程序的输出结果是(B) (选一项)

int b=2;

int func(int *a)

{b+=*a;return(b);}

main()

{int a=2,res=2;

res+=func(&a);

printf("%d\n",res);

}

a) 4

b) 6

c) 8

d) 10


4、下列程序变量b的运行的结果是 (a)。(选一项)

int 1;

int a<<1;

a) 2

b) 1

c) 0

d) 运行错误


5、以下程序的输出结果是:(B) (选一项)
main()
{char *s="12134211";
int v[4]={0,0,0,0},k,i;
for(k=0;s[k];k++)
{switch(s[k])
{case '1':i=0;
case '2':i=1;
case '3':i=2;
case '4':i=3;
}
v[i]++;
}
for(k=0;k<4;k++) printf("%d ",v[k]);
}
a) 1
b) 8
c) 8
d) 8
6、以下程序运行后,输出结果是(B)(选一项)
struct abc
{
int a,b,c;
};
main()
{
struct abc s[2] {{1,2,3},{4,5,6}};
int t;
s[0].a s[1].b;
printf(“%d”,t);
}
a) 5
b) 6
c) 7
d) 8
0 0