Understanding pointers?

后端 未结 6 396
北恋
北恋 2020-12-11 11:25

As the title suggests, I\'m having trouble understanding exactly what a pointer is and why they\'re used. I\'ve searched around a bit but still don\'t really understand. I\'

相关标签:
6条回答
  • 2020-12-11 11:44

    I think maybe you have got a bit confused between the declaration of a pointer variable, and the use of a pointer.

    Any data type with an asterisk after it is the address of a value of the data type.

    So, in C, you could write:
    char c;
    and that means value of c is a single character. But
    char *p;
    is the address of a char.

    The '*' after the type name, means the value of the variable is the address of a thing of that type.

    Let's put a value into c:
    c = 'H';

    So
    char *p;
    means the value of p is the address of a character. p doesn't contain a character, it contains the address of a character.

    The C operator & yields the address of a value, so
    p = &c;
    means put the address of the variable c into p. We say 'p points at c'.

    Now here is the slightly odd part. The address of the first character in a string is also the address of the start of the string.

    So for
    char *p = "Hello World. I hope you are all who safe, sound, and healthy";
    p contains the address of the 'H', and implicitly, because the characters are contiguous, p contains the address of the start of the string.

    To get at the character at the start of the string, the 'H', use the 'get at the thing pointed to' operator, which is '*'.

    So *p is 'H'

    p = &c; if (*p == c) { ... is true ... }

    When a function or method is called, to use the string of characters, the only the start address of the string (typically 4 or 8 bytes) need be handed to the function, and not the entire string. This is both efficient, and also means the function can act upon the string, and change it, which may be useful. It also means that the string can be shared.

    0 讨论(0)
  • 2020-12-11 11:45

    A pointer is a special variable that holds the memory location of an other variable.

    So what is a pointer… look at the definition mentioned above. Lets do this one step at a time in the three step process below:

    A pointer is a special variable that holds the memory location of an other variable.

    So a pointer is nothing but a variable… its a special variable. Why is it special, because… read point 2

    A pointer is a special variable that holds the memory location of an other variable.

    It holds the memory location of another variable. By memory location I mean that it does not contain value of another variable, but it stores the memory address number (so to speak) of another variable. What is this other variable, read point 3.

    A pointer is a special variable that holds the memory location of an other variable.

    Another variable could be anything… it could be a float, int, char, double, etc. As long as its a variable, its memory location on which it is created can be assigned to a pointer variable.

    0 讨论(0)
  • 2020-12-11 11:46

    To answer each of your questions:

    (1) From what I understand, a variable with an asterisks in front points to an address in memory?

    You can see it that way more or less. The asterisk is a dereference operator, which takes a pointer and returns the value at the address contained in the pointer.

    (2) I don't quite understand why you'd use a pointer to a value instead of just using the value itself.

    Because pointers allow different sections of code to share information, better than copying the value here and there, and also allows pointed variables or objects to be modified by called function. Further, pointers enabled complex linked data structures. Read this short tutorial Pointers and Memory.

    (3) Why wouldn't you use pointers to integers and other basic data types?

    String is a pointer, unlike int or char. A string is a pointer that points to the starting address of data that contains the string, and return all the value from the starting address of the data until an ending byte.

    string is a more complex datatype than char or int, for example. In fact, don't think sting as type like int of char. string is a pointer that points to a chunk of memory. Due to its complexity, having a Class like NSString to provide useful functions to work with them becomes very meaningful. See NSString.

    When you use NSString, you do not create a string; you create an object that contains a pointer to the starting address of the string, and in addition, a collection of methods that allows you to manipulate the output of the data.

    0 讨论(0)
  • 2020-12-11 11:51

    I don't quite understand why you'd use a pointer to a value instead of just using the value itself.

    You use a pointer when you want to refer to a specific instance of a value instead of a copy of that value. Say you want me to double some value. You've got two options:

    • You can tell me what the value is: "5": "Please double 5 for me." That's called passing by value. I can tell you that the answer is 10, but if you had 5 written down somewhere that 5 will still be there. Anyone else who refers to that paper will still see the 5.

    • You can tell me where the value is: "Please erase the number I've written down here and write twice that number in its place." That's called passing by reference. When I'm done, the original 5 is gone and there's a 10 in its place. Anyone else who refers to that paper will now see 10.

    Pointers are used to refer to some piece of memory rather than copying some piece of memory. When you pass by reference, you pass a pointer to the memory that you're talking about.

    When calling methods on this string, why is it a pointer instead of just using the string directly?

    In Objective-C, we always use pointers to refer to objects. The technical reason for that is that objects are usually allocated dynamically in the heap, so in order to deal with one you need it's address. A more practical way to think about it is that an object, by definition, is a particular instance of some class. If you pass an object to some method, and that method modifies the object, then you'd expect the object you passed in to be changed afterward, and to do that we need to pass the object by reference rather than by value.

    Why wouldn't you use pointers to integers and other basic data types?

    Sometimes we do use pointers to integers and other basic data types. In general, though, we pass those types by value because it's faster. If I want to convey some small piece of data to you, it's faster for me to just give you the data directly than it is to tell you where you can find the information. If the data is large, though, the opposite is true: it's much faster for me to tell you that there's a dictionary in the living room than it is for me to recite the contents of the dictionary.

    0 讨论(0)
  • 2020-12-11 11:55

    I have heard the analogy that an object is like a ballon, an the string you're holding it with is the pointer. Typically, code is executed like so:

    MyClass *someObj = [[MyClass alloc] init];
    

    The alloc call will allocate the memory for the object, and the init will instantiate it with a defined set of default properties depending on the class. You can override init.

    Pointers allow references to be passed to a single object in memory to multiple objects. If we worked with values without pointers, you wouldn't be able to reference the same object in memory in two different places.

    0 讨论(0)
  • 2020-12-11 12:02
    NSString *stringVar = @"This is a test.";
    When calling methods on this string, why is it a pointer instead of just using the string directly?

    This is a fairly existential question. I would posit it this way: what is the string if not its location? How would you implement a system if you can't refer to objects somehow? By name, sure... But what is that name? How does the machine understand it?

    The CPU has instructions that work with operands. "Add x to y and store the result here." Those operands can be registers (say, for a 32-bit integer, like that i in the proverbial for loop might be stored), but those are limited in number. I probably don't need to convince you that some form of memory is needed. I would then argue, how do you tell the CPU where to find those things in memory if not for pointers?

    You: "Add x to y and store it in memory."
    CPU: OK. Where?
    You: Uh, I dunno, like, where ever ...

    At the lowest levels, it doesn't work like this last line. You need to be a bit more specific for the CPU to work. :-)

    So really, all the pointer does is say "the string at X", where X is an integer. Because in order to do something you need to know where you're working. In the same way that when you have an array of integers a, and you need to take a[i], i is meaningful to you somehow. How is that meaningful? Well it depends on your program. But you can't argue that this i shouldn't exist.

    In reality in those other languages, you're working with pointers as well. You're just not aware of it. Some people would say that they prefer it that way. But ultimately, when you go down through all the layers of abstraction, you're going to need to tell the CPU what part of memory to look at. :-) So I would argue that pointers are necessary no matter what abstractions you end up building.

    0 讨论(0)
提交回复
热议问题