C语言10 指针基本操作+引用+指针分配内存GetMemory

1、一个32位的机器,该机器的指针是多少位?可以访问多大的地址空间?

答: 32bit  2^32 = 4G    

地址总线宽度决定了CPU可以访问的物理地址空间.简单地说就是CPU能够使用多大容量的内存.对于386以上的微机系统.地址线的宽度为32位.最多可以直接访问4096MB (4GB)的物理空间。

指针即是地址值,地址的编号。指针是多少位只要看地址总线的位数就行了。80386以后的机子都是32的数据总线。所以指针的位数就是4个字节了。

8位处理器、16位处理器、32位处理器和64位处理器,其计数都是8的倍数。它表示一个时钟周期里,处理器处理的二进制代码数。“0”和“1”就是二进制代码,线路上有电信号,则计做1,没有电信号则为0。8位机有8条线路,每个时钟周期有8个电信号,组成一个字节。所以,随8位处理器上升至64位处理器,每个时钟周期传送1个字节到8个字节,关联到时钟速度提高到若干个千兆赫之后,处理器处理信息的能力越来越大。

CPU 的一次基本运算 (and, or, xor, not), 能处理/运算几个 bits.

64 bits data交由 32-bit CPU 去运算需要分两次处理。

2、用变量a给出下面的定义:

a)一个整型数(An integer)

b) 一个指向整型数的指针(A pointer to an integer)

c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer)

d) 一个有10个整型数的数组(An array of 10 integers)

e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers)

f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)

g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)

h) 一个有10个函数指针的数组,该数组的每一个指针都指向一个函数,这个函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer )

// Int (*p[10])(int); 如int max();表示返回值为int型,又如void表无返回值。

i)一个函数有一个整型参数并返回一个指向整型数指针。

答案是:

a) int a;

b) int *a;

c) int **a;

d) int a[10];

e) int *a[10];

f) int (*a)[10]; //指向整型一位数组的指针

g) int (*a)(int);

h) int (*a[10])(int);//函数指针数组

i) int *a(int);

================

@指针数组与数组指针的差异?如何初始化一个指针数组?

1]指针数组:数组里存储的是多个指针。

如:int * s[ 5 ] 表示数组s里存储了5个指向整型的指针。

  char * s[ 3 ] = {“aaaaa”, ”bbb”, ”ccccc”}  

表示数组s里存储3个指向字符型的指针,分别指向字符串aaaaa、bbb、ccccc。

2] 数组指针:指针指向的一个数组。

如:int ( * s )[ 5 ] 表示数组s里存储了5个整型数据。

{ 
    char arrayT[2][5]={0}; 
    char *s[3] = {"aaaaa", "bbb", "ccccc"}; 
    char (*p)[5] = &arrayT[0]; 
    p = arrayT+1; 
    char arrayB[] = "bbbc"; 
    p = &arrayB; 
}

=======================

3、以下代码有什么问题?

(1)

int main()
{
    char a;
    char *str = &a;
    strcpy(str,"hello");
    printf(str);
    return 0;
}

答:没有为str分配内存空间,将会发生异常。

将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内存读写而导致程序崩溃。

(2)

swap( int* p1,int* p2 )
{
    int *p;  
    *p = *p1;
    *p1 = *p2;
    *p2 = *p;
}

p是一个野指针,可能指向系统区,导致程序运行崩溃。修改如下:

swap( int* p1,int* p2 )
{
    int p;
    p = *p1;
    *p1 = *p2;
    *p2 = p;
}

==============================C++:引用

4、

(1)引用与指针有什么区别?

1) 引用必须被初始化,指针不必。

2) 引用初始化以后不能被改变,指针可以改变所指的对象。

3) 不存在指向空值的引用,但是存在指向空值的指针。

4) 其中传引用不会重新分配空间,可以节省资源,提高效率。而传指针则会。

(2)引用的指针:没有指向引用的指针!因为引用不是对象,没有地址。

(3)指针的引用:

{
    int a = 1;
    int &b = a;          //声明b是a的引用,b和a是同一个变量。
    int *p = &a;
    int *&c = p;        //声明c是p的引用,c和p是同一个变量,同享一个内存单元。
}    

====================================GetMemory

5、以下程序有什么问题?

(1)

#include <stdio.h>
#include <stdlib.h>

void GetMemory(char *p) 
{
    p = (char *) malloc(100);
}

int main()
{
    char *str=NULL;
    GetMemory(str);
    strcpy(str, "hello world");
    printf("%s\n",str);
    free(str);
    
    return 0;
}

答:程序崩溃。

[1]GetMemory函数的参数是局部变量,给它分配的内存还在,但是P释放了。

[2]free()对str的操作也非法。

修改方法:

[1]返回指针

char* GetMemory(char *p) 
{
    p = (char *) malloc(100); //malloc申请的空间要等free释放
    return p;
}

[2]使用引用传递:

void GetMemory(char *&p) ;

(2)

char *GetMemory(void)
{
    char p[] = "hello world"; 
    return p;  //p[]数组是函数内的局部自动变量,函数返回后内存就释放了。
}//p指针本身可以返回
 
void Test(void)
{
     char *str = NULL;
    str = GetMemory();
    printf(str);    //输出乱码
}

(3)

void GetMemory( char **p, int num )
{  //添加判断 if (num>0)
     *p = (char *) malloc( num ); 
//也可以添加判断 if(! p)  exit(1);
 } 
 
void Test( void )
{
 char *str = NULL;
 GetMemory(&str, 100 );  //添加判断if (str){... free(str); str=NULL; }
 strcpy( str, "hello" ); //可以输出hello
 printf( str );
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值